vagrant-bosh 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.gitmodules +6 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +73 -0
- data/Rakefile +2 -0
- data/dev/.gitignore +1 -0
- data/dev/Vagrantfile +30 -0
- data/dev/example-bosh-manifest.yml +188 -0
- data/dev/example-winston-manifest.yml +70 -0
- data/go/.gitignore +11 -0
- data/go/bin/build +10 -0
- data/go/bin/build-linux-amd64 +9 -0
- data/go/bin/env +13 -0
- data/go/bin/go +5 -0
- data/go/bin/golint +19 -0
- data/go/bin/test +37 -0
- data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
- data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
- data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
- data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
- data/go/src/boshprovisioner/deployment/deployment.go +221 -0
- data/go/src/boshprovisioner/deployment/instance.go +54 -0
- data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
- data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
- data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
- data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
- data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
- data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
- data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
- data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
- data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
- data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
- data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
- data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
- data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
- data/go/src/boshprovisioner/eventlog/log.go +72 -0
- data/go/src/boshprovisioner/eventlog/stage.go +39 -0
- data/go/src/boshprovisioner/eventlog/task.go +58 -0
- data/go/src/boshprovisioner/index/file_index.go +289 -0
- data/go/src/boshprovisioner/index/file_index_test.go +296 -0
- data/go/src/boshprovisioner/index/index_interface.go +18 -0
- data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
- data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
- data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
- data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
- data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
- data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
- data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
- data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
- data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
- data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
- data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
- data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
- data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
- data/go/src/boshprovisioner/main/config.go +77 -0
- data/go/src/boshprovisioner/main/main.go +183 -0
- data/go/src/boshprovisioner/main/repos_factory.go +96 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
- data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
- data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
- data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
- data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
- data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
- data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
- data/go/src/boshprovisioner/release/job/job.go +86 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
- data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
- data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
- data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
- data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
- data/go/src/boshprovisioner/release/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/release.go +144 -0
- data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/release_test.go +129 -0
- data/go/src/boshprovisioner/release/tar_reader.go +139 -0
- data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
- data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
- data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
- data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
- data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
- data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
- data/go/src/boshprovisioner/util/string_keyed.go +70 -0
- data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
- data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
- data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
- data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
- data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
- data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
- data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
- data/go/src/boshprovisioner/vm/vm.go +19 -0
- data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
- data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
- data/lib/vagrant-bosh/asset_uploader.rb +53 -0
- data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
- data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
- data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
- data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
- data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
- data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
- data/lib/vagrant-bosh/assets/monit/monit +0 -0
- data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
- data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
- data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +59 -0
- data/lib/vagrant-bosh/communicator.rb +50 -0
- data/lib/vagrant-bosh/config.rb +15 -0
- data/lib/vagrant-bosh/errors.rb +11 -0
- data/lib/vagrant-bosh/plugin.rb +25 -0
- data/lib/vagrant-bosh/provisioner.rb +46 -0
- data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
- data/lib/vagrant-bosh/ui.rb +77 -0
- data/lib/vagrant-bosh/version.rb +5 -0
- data/lib/vagrant-bosh.rb +15 -0
- data/templates/locales/en.yml +15 -0
- data/vagrant-bosh.gemspec +20 -0
- metadata +191 -0
data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
package erbrenderer
|
|
2
|
+
|
|
3
|
+
const templateEvaluationContextRb = `
|
|
4
|
+
# Based on common/properties/template_evaluation_context.rb
|
|
5
|
+
require "rubygems"
|
|
6
|
+
require "ostruct"
|
|
7
|
+
require "json"
|
|
8
|
+
require "erb"
|
|
9
|
+
|
|
10
|
+
class TemplateEvaluationContext
|
|
11
|
+
attr_reader :name, :index
|
|
12
|
+
attr_reader :properties, :raw_properties
|
|
13
|
+
attr_reader :spec
|
|
14
|
+
|
|
15
|
+
def initialize(spec)
|
|
16
|
+
@name = spec["job"]["name"] if spec["job"].is_a?(Hash)
|
|
17
|
+
@index = spec["index"]
|
|
18
|
+
@properties = openstruct(spec["properties"] || {})
|
|
19
|
+
@raw_properties = spec["properties"] || {}
|
|
20
|
+
@spec = openstruct(spec)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get_binding
|
|
24
|
+
binding.taint
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def p(*args)
|
|
28
|
+
names = Array(args[0])
|
|
29
|
+
|
|
30
|
+
names.each do |name|
|
|
31
|
+
result = lookup_property(@raw_properties, name)
|
|
32
|
+
return result unless result.nil?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
return args[1] if args.length == 2
|
|
36
|
+
raise UnknownProperty.new(names)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def if_p(*names)
|
|
40
|
+
values = names.map do |name|
|
|
41
|
+
value = lookup_property(@raw_properties, name)
|
|
42
|
+
return ActiveElseBlock.new(self) if value.nil?
|
|
43
|
+
value
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
yield *values
|
|
47
|
+
InactiveElseBlock.new
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def openstruct(object)
|
|
53
|
+
case object
|
|
54
|
+
when Hash
|
|
55
|
+
mapped = object.inject({}) { |h, (k,v)| h[k] = openstruct(v); h }
|
|
56
|
+
OpenStruct.new(mapped)
|
|
57
|
+
when Array
|
|
58
|
+
object.map { |item| openstruct(item) }
|
|
59
|
+
else
|
|
60
|
+
object
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def lookup_property(collection, name)
|
|
65
|
+
keys = name.split(".")
|
|
66
|
+
ref = collection
|
|
67
|
+
|
|
68
|
+
keys.each do |key|
|
|
69
|
+
ref = ref[key]
|
|
70
|
+
return nil if ref.nil?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
ref
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
class UnknownProperty < StandardError
|
|
77
|
+
attr_reader :name
|
|
78
|
+
|
|
79
|
+
def initialize(name)
|
|
80
|
+
@name = name
|
|
81
|
+
super("Can't find property '#{name}'")
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
class ActiveElseBlock
|
|
86
|
+
def initialize(template)
|
|
87
|
+
@context = template
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def else
|
|
91
|
+
yield
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def else_if_p(*names, &block)
|
|
95
|
+
@context.if_p(*names, &block)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
class InactiveElseBlock
|
|
100
|
+
def else; end
|
|
101
|
+
|
|
102
|
+
def else_if_p(*names)
|
|
103
|
+
InactiveElseBlock.new
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# todo do not use JSON in releases
|
|
109
|
+
class << JSON
|
|
110
|
+
alias dump_array_or_hash dump
|
|
111
|
+
|
|
112
|
+
def dump(*args)
|
|
113
|
+
arg = args[0]
|
|
114
|
+
if arg.is_a?(String) || arg.is_a?(Numeric)
|
|
115
|
+
arg.inspect
|
|
116
|
+
else
|
|
117
|
+
dump_array_or_hash(*args)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class ERBRenderer
|
|
123
|
+
def initialize(context)
|
|
124
|
+
@context = context
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def render(src_path, dst_path)
|
|
128
|
+
erb = ERB.new(File.read(src_path))
|
|
129
|
+
erb.filename = src_path
|
|
130
|
+
|
|
131
|
+
File.open(dst_path, "w") do |f|
|
|
132
|
+
f.write(erb.result(@context.get_binding))
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
rescue Exception => e
|
|
136
|
+
name = "#{@context.name}/#{@context.index}"
|
|
137
|
+
|
|
138
|
+
line_i = e.backtrace.index { |l| l.include?(erb.filename) }
|
|
139
|
+
line_num = line_i ? e.backtrace[line_i].split(':')[1] : "unknown"
|
|
140
|
+
location = "(line #{line_num}: #{e.inspect})"
|
|
141
|
+
|
|
142
|
+
raise("Error filling in template '#{src_path}' for #{name} #{location}")
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
if $0 == __FILE__
|
|
147
|
+
context_path, src_path, dst_path = *ARGV
|
|
148
|
+
|
|
149
|
+
context_hash = JSON.load(File.read(context_path))
|
|
150
|
+
context = TemplateEvaluationContext.new(context_hash)
|
|
151
|
+
|
|
152
|
+
renderer = ERBRenderer.new(context)
|
|
153
|
+
renderer.render(src_path, dst_path)
|
|
154
|
+
end
|
|
155
|
+
`
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
package jobsrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpindex "boshprovisioner/index"
|
|
8
|
+
bprel "boshprovisioner/release"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type CJRepository struct {
|
|
12
|
+
index bpindex.Index
|
|
13
|
+
logger boshlog.Logger
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type jobToJobKey struct {
|
|
17
|
+
JobName string
|
|
18
|
+
JobVersion string
|
|
19
|
+
|
|
20
|
+
// Fingerprint of a package captures its dependenices
|
|
21
|
+
JobFingerprint string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func NewConcreteJobsRepository(
|
|
25
|
+
index bpindex.Index,
|
|
26
|
+
logger boshlog.Logger,
|
|
27
|
+
) CJRepository {
|
|
28
|
+
return CJRepository{
|
|
29
|
+
index: index,
|
|
30
|
+
logger: logger,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (r CJRepository) Find(job bprel.Job) (JobRecord, bool, error) {
|
|
35
|
+
var record JobRecord
|
|
36
|
+
|
|
37
|
+
err := r.index.Find(r.jobKey(job), &record)
|
|
38
|
+
if err != nil {
|
|
39
|
+
if err == bpindex.ErrNotFound {
|
|
40
|
+
return record, false, nil
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return record, false, bosherr.WrapError(err, "Finding package record")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return record, true, nil
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func (r CJRepository) Save(job bprel.Job, record JobRecord) error {
|
|
50
|
+
err := r.index.Save(r.jobKey(job), record)
|
|
51
|
+
if err != nil {
|
|
52
|
+
return bosherr.WrapError(err, "Saving package record")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return nil
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func (r CJRepository) jobKey(job bprel.Job) jobToJobKey {
|
|
59
|
+
return jobToJobKey{
|
|
60
|
+
JobName: job.Name,
|
|
61
|
+
JobVersion: job.Version,
|
|
62
|
+
JobFingerprint: job.Fingerprint,
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
package jobsrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpindex "boshprovisioner/index"
|
|
8
|
+
bprel "boshprovisioner/release"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type CRPRepository struct {
|
|
12
|
+
index bpindex.Index
|
|
13
|
+
logger boshlog.Logger
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
func NewConcreteRuntimePackagesRepository(
|
|
17
|
+
index bpindex.Index,
|
|
18
|
+
logger boshlog.Logger,
|
|
19
|
+
) CRPRepository {
|
|
20
|
+
return CRPRepository{
|
|
21
|
+
index: index,
|
|
22
|
+
logger: logger,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type jobToPkgsKey struct {
|
|
27
|
+
// Mostly for ease of debugging
|
|
28
|
+
JobName string
|
|
29
|
+
JobVersion string
|
|
30
|
+
|
|
31
|
+
// Fingerprint of a job captures its dependenices
|
|
32
|
+
JobFingerprint string
|
|
33
|
+
|
|
34
|
+
// Indicates if contains all packages in a job's release
|
|
35
|
+
ContainsAllPackages bool
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func (r CRPRepository) FindByReleaseJob(job bprel.Job) ([]bprel.Package, bool, error) {
|
|
39
|
+
var pkgs []bprel.Package
|
|
40
|
+
|
|
41
|
+
err := r.index.Find(r.jobSpecificKey(job), &pkgs)
|
|
42
|
+
if err != nil {
|
|
43
|
+
if err == bpindex.ErrNotFound {
|
|
44
|
+
return pkgs, false, nil
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return pkgs, false, bosherr.WrapError(err, "Finding rel-job -> specific rel-pkgs record")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return pkgs, true, nil
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
func (r CRPRepository) SaveForReleaseJob(job bprel.Job, pkgs []bprel.Package) error {
|
|
54
|
+
err := r.index.Save(r.jobSpecificKey(job), pkgs)
|
|
55
|
+
if err != nil {
|
|
56
|
+
return bosherr.WrapError(err, "Saving rel-job -> specific rel-pkgs record")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return nil
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// FindAllByReleaseJob keeps association between all possible packages for a job
|
|
63
|
+
func (r CRPRepository) FindAllByReleaseJob(job bprel.Job) ([]bprel.Package, bool, error) {
|
|
64
|
+
var pkgs []bprel.Package
|
|
65
|
+
|
|
66
|
+
err := r.index.Find(r.jobAllKey(job), &pkgs)
|
|
67
|
+
if err != nil {
|
|
68
|
+
if err == bpindex.ErrNotFound {
|
|
69
|
+
return pkgs, false, nil
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return pkgs, false, bosherr.WrapError(err, "Finding rel-job -> all rel-pkgs record")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return pkgs, true, nil
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func (r CRPRepository) SaveAllForReleaseJob(job bprel.Job, pkgs []bprel.Package) error {
|
|
79
|
+
err := r.index.Save(r.jobAllKey(job), pkgs)
|
|
80
|
+
if err != nil {
|
|
81
|
+
return bosherr.WrapError(err, "Saving rel-job -> all rel-pkgs record")
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return nil
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
func (r CRPRepository) jobSpecificKey(job bprel.Job) jobToPkgsKey {
|
|
88
|
+
return jobToPkgsKey{
|
|
89
|
+
JobName: job.Name,
|
|
90
|
+
JobVersion: job.Version,
|
|
91
|
+
JobFingerprint: job.Fingerprint,
|
|
92
|
+
|
|
93
|
+
ContainsAllPackages: false,
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func (r CRPRepository) jobAllKey(job bprel.Job) jobToPkgsKey {
|
|
98
|
+
return jobToPkgsKey{
|
|
99
|
+
JobName: job.Name,
|
|
100
|
+
JobVersion: job.Version,
|
|
101
|
+
JobFingerprint: job.Fingerprint,
|
|
102
|
+
|
|
103
|
+
ContainsAllPackages: true,
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
package jobsrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpdep "boshprovisioner/deployment"
|
|
8
|
+
bpindex "boshprovisioner/index"
|
|
9
|
+
bprel "boshprovisioner/release"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
type CTTJRepository struct {
|
|
13
|
+
index bpindex.Index
|
|
14
|
+
logger boshlog.Logger
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type templateToJobKey struct {
|
|
18
|
+
JobName string
|
|
19
|
+
ReleaseName string
|
|
20
|
+
ReleaseVersion string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func NewConcreteTemplateToJobRepository(
|
|
24
|
+
index bpindex.Index,
|
|
25
|
+
logger boshlog.Logger,
|
|
26
|
+
) CTTJRepository {
|
|
27
|
+
return CTTJRepository{
|
|
28
|
+
index: index,
|
|
29
|
+
logger: logger,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func (r CTTJRepository) FindByTemplate(template bpdep.Template) (bprel.Job, bool, error) {
|
|
34
|
+
var job bprel.Job
|
|
35
|
+
|
|
36
|
+
err := r.index.Find(r.templateKey(template), &job)
|
|
37
|
+
if err != nil {
|
|
38
|
+
if err == bpindex.ErrNotFound {
|
|
39
|
+
return job, false, nil
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return job, false, bosherr.WrapError(err, "Finding dep-template -> rel-job record")
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return job, true, nil
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func (r CTTJRepository) SaveForJob(release bprel.Release, job bprel.Job) error {
|
|
49
|
+
err := r.index.Save(r.jobKey(release, job), job)
|
|
50
|
+
if err != nil {
|
|
51
|
+
return bosherr.WrapError(err, "Saving dep-template -> rel-job record")
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return nil
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
func (r CTTJRepository) templateKey(template bpdep.Template) templateToJobKey {
|
|
58
|
+
if template.Release == nil {
|
|
59
|
+
panic("Expected template.Release to not be nil")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return templateToJobKey{
|
|
63
|
+
JobName: template.Name,
|
|
64
|
+
ReleaseName: template.Release.Name,
|
|
65
|
+
ReleaseVersion: template.Release.Version,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// todo should job point back to release
|
|
70
|
+
func (r CTTJRepository) jobKey(release bprel.Release, job bprel.Job) templateToJobKey {
|
|
71
|
+
return templateToJobKey{
|
|
72
|
+
JobName: job.Name,
|
|
73
|
+
ReleaseName: release.Name,
|
|
74
|
+
ReleaseVersion: release.Version,
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package jobsrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bpdep "boshprovisioner/deployment"
|
|
5
|
+
bprel "boshprovisioner/release"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
type JobRecord struct {
|
|
9
|
+
BlobID string
|
|
10
|
+
SHA1 string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// JobsRepository maintains list of job source code as blobs
|
|
14
|
+
type JobsRepository interface {
|
|
15
|
+
Find(bprel.Job) (JobRecord, bool, error)
|
|
16
|
+
Save(bprel.Job, JobRecord) error
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type TemplateToJobRepository interface {
|
|
20
|
+
FindByTemplate(bpdep.Template) (bprel.Job, bool, error)
|
|
21
|
+
SaveForJob(bprel.Release, bprel.Job) error
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type RuntimePackagesRepository interface {
|
|
25
|
+
FindByReleaseJob(bprel.Job) ([]bprel.Package, bool, error)
|
|
26
|
+
SaveForReleaseJob(bprel.Job, []bprel.Package) error
|
|
27
|
+
|
|
28
|
+
// Keeps association between all possible packages for a job
|
|
29
|
+
FindAllByReleaseJob(bprel.Job) ([]bprel.Package, bool, error)
|
|
30
|
+
SaveAllForReleaseJob(bprel.Job, []bprel.Package) error
|
|
31
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
package templatescompiler
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"path/filepath"
|
|
5
|
+
|
|
6
|
+
bosherr "bosh/errors"
|
|
7
|
+
boshlog "bosh/logger"
|
|
8
|
+
boshsys "bosh/system"
|
|
9
|
+
|
|
10
|
+
bpdep "boshprovisioner/deployment"
|
|
11
|
+
bperb "boshprovisioner/instance/templatescompiler/erbrenderer"
|
|
12
|
+
bpreljob "boshprovisioner/release/job"
|
|
13
|
+
bptar "boshprovisioner/tar"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
type RenderedArchivesCompiler struct {
|
|
17
|
+
fs boshsys.FileSystem
|
|
18
|
+
runner boshsys.CmdRunner
|
|
19
|
+
compressor bptar.Compressor
|
|
20
|
+
logger boshlog.Logger
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func NewRenderedArchivesCompiler(
|
|
24
|
+
fs boshsys.FileSystem,
|
|
25
|
+
runner boshsys.CmdRunner,
|
|
26
|
+
compressor bptar.Compressor,
|
|
27
|
+
logger boshlog.Logger,
|
|
28
|
+
) RenderedArchivesCompiler {
|
|
29
|
+
return RenderedArchivesCompiler{
|
|
30
|
+
fs: fs,
|
|
31
|
+
runner: runner,
|
|
32
|
+
compressor: compressor,
|
|
33
|
+
logger: logger,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Compile takes release jobs and instance and produces rendered templates archive.
|
|
38
|
+
// Rendered templates archive contains rendered job templates
|
|
39
|
+
// that can be unpacked by a GoAgent to populate a VM.
|
|
40
|
+
func (rac RenderedArchivesCompiler) Compile(relJobs []bpreljob.Job, instance bpdep.Instance) (string, error) {
|
|
41
|
+
path, err := rac.fs.TempDir("instance-templatescompiler-RenderedArchivesCompiler")
|
|
42
|
+
if err != nil {
|
|
43
|
+
return "", bosherr.WrapError(err, "Creating compiled templates directory")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
defer rac.fs.RemoveAll(path)
|
|
47
|
+
|
|
48
|
+
for _, relJob := range relJobs {
|
|
49
|
+
context := bperb.NewTemplateEvaluationContext(relJob, instance)
|
|
50
|
+
|
|
51
|
+
renderer := bperb.NewERBRenderer(rac.fs, rac.runner, context, rac.logger)
|
|
52
|
+
|
|
53
|
+
dstPath := filepath.Join(path, relJob.Name, "monit")
|
|
54
|
+
|
|
55
|
+
err := renderer.Render(relJob.MonitTemplate.Path, dstPath)
|
|
56
|
+
if err != nil {
|
|
57
|
+
return "", bosherr.WrapError(err, "Rendering monit ERB")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for _, template := range relJob.Templates {
|
|
61
|
+
dstPath := filepath.Join(path, relJob.Name, template.DstPathEnd)
|
|
62
|
+
|
|
63
|
+
err := renderer.Render(template.Path, dstPath)
|
|
64
|
+
if err != nil {
|
|
65
|
+
return "", bosherr.WrapError(err, "Rendering %s ERB", template.DstPathEnd)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
renderedArchivePath, err := rac.compressor.Compress(path)
|
|
71
|
+
if err != nil {
|
|
72
|
+
return "", bosherr.WrapError(err, "Compressing templates")
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return renderedArchivePath, nil
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// CleanUp deletes previously produced rendered templates archive.
|
|
79
|
+
func (rac RenderedArchivesCompiler) CleanUp(path string) error {
|
|
80
|
+
return rac.fs.RemoveAll(path)
|
|
81
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package templatescompiler
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bpdep "boshprovisioner/deployment"
|
|
5
|
+
bprel "boshprovisioner/release"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
type RenderedArchiveRecord struct {
|
|
9
|
+
SHA1 string
|
|
10
|
+
BlobID string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
type TemplatesCompiler interface {
|
|
14
|
+
Precompile(bprel.Release) error
|
|
15
|
+
Compile(bpdep.Job, bpdep.Instance) error
|
|
16
|
+
FindRenderedArchive(bpdep.Job, bpdep.Instance) (RenderedArchiveRecord, error)
|
|
17
|
+
|
|
18
|
+
// todo does it belong here?
|
|
19
|
+
FindPackages(template bpdep.Template) ([]bprel.Package, error)
|
|
20
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package templatesrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpdep "boshprovisioner/deployment"
|
|
8
|
+
bpindex "boshprovisioner/index"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
type CTRepository struct {
|
|
12
|
+
index bpindex.Index
|
|
13
|
+
logger boshlog.Logger
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// todo fingerprint property changes
|
|
17
|
+
type jobToTemplateKey struct {
|
|
18
|
+
JobName string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func NewConcreteTemplatesRepository(
|
|
22
|
+
index bpindex.Index,
|
|
23
|
+
logger boshlog.Logger,
|
|
24
|
+
) CTRepository {
|
|
25
|
+
return CTRepository{index: index, logger: logger}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
func (tr CTRepository) Find(job bpdep.Job, instance bpdep.Instance) (TemplateRecord, bool, error) {
|
|
29
|
+
var record TemplateRecord
|
|
30
|
+
|
|
31
|
+
err := tr.index.Find(tr.templateKey(job), &record)
|
|
32
|
+
if err != nil {
|
|
33
|
+
if err == bpindex.ErrNotFound {
|
|
34
|
+
return record, false, nil
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return record, false, bosherr.WrapError(err, "Finding tempate")
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return record, true, nil
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
func (tr CTRepository) Save(job bpdep.Job, instance bpdep.Instance, record TemplateRecord) error {
|
|
44
|
+
err := tr.index.Save(tr.templateKey(job), record)
|
|
45
|
+
if err != nil {
|
|
46
|
+
return bosherr.WrapError(err, "Saving template")
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return nil
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func (tr CTRepository) templateKey(job bpdep.Job) jobToTemplateKey {
|
|
53
|
+
return jobToTemplateKey{JobName: job.Name}
|
|
54
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
package templatesrepo
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bpdep "boshprovisioner/deployment"
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
type TemplateRecord struct {
|
|
8
|
+
BlobID string
|
|
9
|
+
SHA1 string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// TemplatesRepository maintains list of rendered templates as blobs
|
|
13
|
+
type TemplatesRepository interface {
|
|
14
|
+
Find(bpdep.Job, bpdep.Instance) (TemplateRecord, bool, error)
|
|
15
|
+
Save(bpdep.Job, bpdep.Instance, TemplateRecord) error
|
|
16
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
package applier
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
bosherr "bosh/errors"
|
|
5
|
+
boshlog "bosh/logger"
|
|
6
|
+
|
|
7
|
+
bpagclient "boshprovisioner/agent/client"
|
|
8
|
+
bpdep "boshprovisioner/deployment"
|
|
9
|
+
bptplcomp "boshprovisioner/instance/templatescompiler"
|
|
10
|
+
bppkgscomp "boshprovisioner/packagescompiler"
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
const applierLogTag = "Applier"
|
|
14
|
+
|
|
15
|
+
type Applier struct {
|
|
16
|
+
depJob bpdep.Job
|
|
17
|
+
instance bpdep.Instance
|
|
18
|
+
|
|
19
|
+
templatesCompiler bptplcomp.TemplatesCompiler
|
|
20
|
+
packagesCompiler bppkgscomp.PackagesCompiler
|
|
21
|
+
|
|
22
|
+
agentClient bpagclient.Client
|
|
23
|
+
logger boshlog.Logger
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
func NewApplier(
|
|
27
|
+
depJob bpdep.Job,
|
|
28
|
+
instance bpdep.Instance,
|
|
29
|
+
templatesCompiler bptplcomp.TemplatesCompiler,
|
|
30
|
+
packagesCompiler bppkgscomp.PackagesCompiler,
|
|
31
|
+
agentClient bpagclient.Client,
|
|
32
|
+
logger boshlog.Logger,
|
|
33
|
+
) Applier {
|
|
34
|
+
return Applier{
|
|
35
|
+
depJob: depJob,
|
|
36
|
+
instance: instance,
|
|
37
|
+
|
|
38
|
+
templatesCompiler: templatesCompiler,
|
|
39
|
+
packagesCompiler: packagesCompiler,
|
|
40
|
+
|
|
41
|
+
agentClient: agentClient,
|
|
42
|
+
logger: logger,
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func (a Applier) Apply() error {
|
|
47
|
+
a.logger.Debug(applierLogTag, "Applying empty state")
|
|
48
|
+
|
|
49
|
+
emptyState := NewEmptyState(a.instance)
|
|
50
|
+
|
|
51
|
+
_, err := a.agentClient.Apply(emptyState.AsApplySpec())
|
|
52
|
+
if err != nil {
|
|
53
|
+
return bosherr.WrapError(err, "Applying empty spec")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Changes local copy of an instance
|
|
57
|
+
a.instance.CurrentState, err = a.agentClient.GetState()
|
|
58
|
+
if err != nil {
|
|
59
|
+
return bosherr.WrapError(err, "Getting state")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
a.logger.Debug(applierLogTag, "Finished applying empty state")
|
|
63
|
+
|
|
64
|
+
// Recompile job templates since current instance state might have changed.
|
|
65
|
+
// e.g. dynamic IP could now be set
|
|
66
|
+
err = a.templatesCompiler.Compile(a.depJob, a.instance)
|
|
67
|
+
if err != nil {
|
|
68
|
+
return bosherr.WrapError(err, "Compiling templates %s", a.depJob.Name)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
a.logger.Debug(applierLogTag, "Applying job state")
|
|
72
|
+
|
|
73
|
+
jobState := NewJobState(
|
|
74
|
+
a.depJob,
|
|
75
|
+
a.instance,
|
|
76
|
+
a.templatesCompiler,
|
|
77
|
+
a.packagesCompiler,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
jobApplySpec, err := jobState.AsApplySpec()
|
|
81
|
+
if err != nil {
|
|
82
|
+
return err
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
_, err = a.agentClient.Apply(jobApplySpec)
|
|
86
|
+
if err != nil {
|
|
87
|
+
return bosherr.WrapError(err, "Applying job spec")
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
a.logger.Debug(applierLogTag, "Finished applying job state")
|
|
91
|
+
|
|
92
|
+
return nil
|
|
93
|
+
}
|