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.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.gitmodules +6 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +73 -0
  7. data/Rakefile +2 -0
  8. data/dev/.gitignore +1 -0
  9. data/dev/Vagrantfile +30 -0
  10. data/dev/example-bosh-manifest.yml +188 -0
  11. data/dev/example-winston-manifest.yml +70 -0
  12. data/go/.gitignore +11 -0
  13. data/go/bin/build +10 -0
  14. data/go/bin/build-linux-amd64 +9 -0
  15. data/go/bin/env +13 -0
  16. data/go/bin/go +5 -0
  17. data/go/bin/golint +19 -0
  18. data/go/bin/test +37 -0
  19. data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
  20. data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
  21. data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
  22. data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
  23. data/go/src/boshprovisioner/deployment/deployment.go +221 -0
  24. data/go/src/boshprovisioner/deployment/instance.go +54 -0
  25. data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
  26. data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
  27. data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
  28. data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
  29. data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
  30. data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
  31. data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
  32. data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
  33. data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
  34. data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
  35. data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
  36. data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
  37. data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
  38. data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
  39. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
  40. data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
  41. data/go/src/boshprovisioner/eventlog/log.go +72 -0
  42. data/go/src/boshprovisioner/eventlog/stage.go +39 -0
  43. data/go/src/boshprovisioner/eventlog/task.go +58 -0
  44. data/go/src/boshprovisioner/index/file_index.go +289 -0
  45. data/go/src/boshprovisioner/index/file_index_test.go +296 -0
  46. data/go/src/boshprovisioner/index/index_interface.go +18 -0
  47. data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
  48. data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
  49. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
  50. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
  51. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
  52. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
  53. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
  54. data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
  55. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
  56. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
  57. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
  58. data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
  59. data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
  60. data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
  61. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
  62. data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
  63. data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
  64. data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
  65. data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
  66. data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
  67. data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
  68. data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
  69. data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
  70. data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
  71. data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
  72. data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
  73. data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
  74. data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
  75. data/go/src/boshprovisioner/main/config.go +77 -0
  76. data/go/src/boshprovisioner/main/main.go +183 -0
  77. data/go/src/boshprovisioner/main/repos_factory.go +96 -0
  78. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
  79. data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
  80. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
  81. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
  82. data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
  83. data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
  84. data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
  85. data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
  86. data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
  87. data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
  88. data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
  89. data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
  90. data/go/src/boshprovisioner/release/job/job.go +86 -0
  91. data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
  92. data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
  93. data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
  94. data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
  95. data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
  96. data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
  97. data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
  98. data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
  99. data/go/src/boshprovisioner/release/reader_factory.go +34 -0
  100. data/go/src/boshprovisioner/release/release.go +144 -0
  101. data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
  102. data/go/src/boshprovisioner/release/release_test.go +129 -0
  103. data/go/src/boshprovisioner/release/tar_reader.go +139 -0
  104. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
  105. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
  106. data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
  107. data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
  108. data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
  109. data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
  110. data/go/src/boshprovisioner/util/string_keyed.go +70 -0
  111. data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
  112. data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
  113. data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
  114. data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
  115. data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
  116. data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
  117. data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
  118. data/go/src/boshprovisioner/vm/vm.go +19 -0
  119. data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
  120. data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
  121. data/lib/vagrant-bosh/asset_uploader.rb +53 -0
  122. data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
  123. data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
  124. data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
  125. data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
  126. data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
  127. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  128. data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
  129. data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
  130. data/lib/vagrant-bosh/assets/monit/monit +0 -0
  131. data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
  132. data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
  133. data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
  134. data/lib/vagrant-bosh/assets/provisioner +0 -0
  135. data/lib/vagrant-bosh/bootstrapper.rb +59 -0
  136. data/lib/vagrant-bosh/communicator.rb +50 -0
  137. data/lib/vagrant-bosh/config.rb +15 -0
  138. data/lib/vagrant-bosh/errors.rb +11 -0
  139. data/lib/vagrant-bosh/plugin.rb +25 -0
  140. data/lib/vagrant-bosh/provisioner.rb +46 -0
  141. data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
  142. data/lib/vagrant-bosh/ui.rb +77 -0
  143. data/lib/vagrant-bosh/version.rb +5 -0
  144. data/lib/vagrant-bosh.rb +15 -0
  145. data/templates/locales/en.yml +15 -0
  146. data/vagrant-bosh.gemspec +20 -0
  147. metadata +191 -0
@@ -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
+ }