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,103 @@
1
+ package updater_test
2
+
3
+ import (
4
+ "errors"
5
+ "time"
6
+
7
+ boshaction "bosh/agent/action"
8
+ boshlog "bosh/logger"
9
+ . "github.com/onsi/ginkgo"
10
+ . "github.com/onsi/gomega"
11
+
12
+ fakebpagclient "boshprovisioner/agent/client/fakes"
13
+ . "boshprovisioner/instance/updater"
14
+ )
15
+
16
+ var _ = Describe("Waiter", func() {
17
+ var (
18
+ sleptTimes []time.Duration
19
+ agentClient *fakebpagclient.FakeClient
20
+ waiter Waiter
21
+ )
22
+
23
+ const (
24
+ firstTimeGap = 5000 * time.Millisecond
25
+ subsequentTimeGap = 1000 * time.Millisecond
26
+ )
27
+
28
+ BeforeEach(func() {
29
+ sleptTimes = []time.Duration{}
30
+ sleepFunc := func(d time.Duration) { sleptTimes = append(sleptTimes, d) }
31
+
32
+ agentClient = &fakebpagclient.FakeClient{}
33
+ logger := boshlog.NewLogger(boshlog.LevelNone)
34
+ waiter = NewWaiter(5000, 14000, sleepFunc, agentClient, logger)
35
+ })
36
+
37
+ Describe("Wait", func() {
38
+ Context("when agent reports its state as 'running' after some time", func() {
39
+ BeforeEach(func() {
40
+ agentClient.GetStateStates = []boshaction.GetStateV1ApplySpec{
41
+ boshaction.GetStateV1ApplySpec{JobState: "not-running"},
42
+ boshaction.GetStateV1ApplySpec{JobState: "not-running"},
43
+ boshaction.GetStateV1ApplySpec{JobState: "not-running"},
44
+ boshaction.GetStateV1ApplySpec{JobState: "not-running"},
45
+ boshaction.GetStateV1ApplySpec{JobState: "not-running"}, // 4
46
+ boshaction.GetStateV1ApplySpec{JobState: "running"},
47
+ }
48
+ })
49
+
50
+ It("waits for instance to become running checking every interval", func() {
51
+ err := waiter.Wait()
52
+ Expect(err).ToNot(HaveOccurred())
53
+
54
+ Expect(sleptTimes).To(Equal([]time.Duration{
55
+ firstTimeGap,
56
+ subsequentTimeGap,
57
+ subsequentTimeGap,
58
+ subsequentTimeGap,
59
+ subsequentTimeGap, // 4
60
+ subsequentTimeGap,
61
+ }))
62
+ })
63
+ })
64
+
65
+ Context("when agent does not report its state as 'running' after some time", func() {
66
+ BeforeEach(func() {
67
+ agentClient.GetStateState = boshaction.GetStateV1ApplySpec{JobState: "not-running"}
68
+ })
69
+
70
+ It("return error after trying as many times as possible", func() {
71
+ err := waiter.Wait()
72
+ Expect(err).To(Equal(ErrNotRunning))
73
+
74
+ Expect(sleptTimes).To(Equal([]time.Duration{
75
+ firstTimeGap,
76
+ subsequentTimeGap,
77
+ subsequentTimeGap,
78
+ subsequentTimeGap,
79
+ subsequentTimeGap, // 4
80
+ subsequentTimeGap,
81
+ subsequentTimeGap,
82
+ subsequentTimeGap,
83
+ subsequentTimeGap, // 8
84
+ subsequentTimeGap,
85
+ }))
86
+ })
87
+ })
88
+
89
+ Context("when agent state cannot be retrieved", func() {
90
+ BeforeEach(func() {
91
+ agentClient.GetStateErr = errors.New("fake-get-state-err")
92
+ })
93
+
94
+ It("returns error indicated failure to retrieve state", func() {
95
+ err := waiter.Wait()
96
+ Expect(err).To(HaveOccurred())
97
+ Expect(err.Error()).To(ContainSubstring("fake-get-state-err"))
98
+
99
+ Expect(sleptTimes).To(Equal([]time.Duration{firstTimeGap}))
100
+ })
101
+ })
102
+ })
103
+ })
@@ -0,0 +1,77 @@
1
+ package main
2
+
3
+ import (
4
+ "encoding/json"
5
+
6
+ bosherr "bosh/errors"
7
+ boshsys "bosh/system"
8
+
9
+ bpprov "boshprovisioner/provisioner"
10
+ )
11
+
12
+ type Config struct {
13
+ ManifestPath string `json:"manifest_path"`
14
+
15
+ // Assets dir is used as a temporary location to transfer files from host to guest.
16
+ // It will not be created since assets already must be present.
17
+ AssetsDir string `json:"assets_dir"`
18
+
19
+ // Repos dir is mainly used to record what was placed in the blobstore.
20
+ // It will be created if it does not exist.
21
+ ReposDir string `json:"repos_dir"`
22
+
23
+ // e.g. "https://user:password@127.0.0.1:4321/agent"
24
+ Mbus string `json:"mbus"`
25
+
26
+ Blobstore bpprov.BlobstoreConfig `json:"blobstore"`
27
+ }
28
+
29
+ func NewConfigFromPath(path string, fs boshsys.FileSystem) (Config, error) {
30
+ var config Config
31
+
32
+ bytes, err := fs.ReadFile(path)
33
+ if err != nil {
34
+ return config, bosherr.WrapError(err, "Reading config %s", path)
35
+ }
36
+
37
+ err = json.Unmarshal(bytes, &config)
38
+ if err != nil {
39
+ return config, bosherr.WrapError(err, "Unmarshalling config")
40
+ }
41
+
42
+ err = config.validate()
43
+ if err != nil {
44
+ return config, bosherr.WrapError(err, "Validating config")
45
+ }
46
+
47
+ return config, nil
48
+ }
49
+
50
+ func (c Config) validate() error {
51
+ if c.ManifestPath == "" {
52
+ return bosherr.New("Must provide non-empty manifest_path")
53
+ }
54
+
55
+ if c.AssetsDir == "" {
56
+ return bosherr.New("Must provide non-empty assets_dir")
57
+ }
58
+
59
+ if c.ReposDir == "" {
60
+ return bosherr.New("Must provide non-empty repos_dir")
61
+ }
62
+
63
+ if c.Mbus == "" {
64
+ return bosherr.New("Must provide non-empty mbus")
65
+ }
66
+
67
+ if c.Blobstore.Type != bpprov.BlobstoreConfigTypeLocal {
68
+ return bosherr.New("Blobstore type must be local")
69
+ }
70
+
71
+ err := c.Blobstore.Validate()
72
+ if err != nil {
73
+ return bosherr.WrapError(err, "Validating blobstore configuration")
74
+ }
75
+
76
+ return nil
77
+ }
@@ -0,0 +1,183 @@
1
+ package main
2
+
3
+ import (
4
+ "flag"
5
+ "os"
6
+
7
+ boshblob "bosh/blobstore"
8
+ boshlog "bosh/logger"
9
+ boshsys "bosh/system"
10
+ boshuuid "bosh/uuid"
11
+
12
+ bpdep "boshprovisioner/deployment"
13
+ bpdload "boshprovisioner/downloader"
14
+ bpeventlog "boshprovisioner/eventlog"
15
+ bptplcomp "boshprovisioner/instance/templatescompiler"
16
+ bpinstupd "boshprovisioner/instance/updater"
17
+ bppkgscomp "boshprovisioner/packagescompiler"
18
+ bpprov "boshprovisioner/provisioner"
19
+ bprel "boshprovisioner/release"
20
+ bpreljob "boshprovisioner/release/job"
21
+ bptar "boshprovisioner/tar"
22
+ bpvm "boshprovisioner/vm"
23
+ )
24
+
25
+ const mainLogTag = "main"
26
+
27
+ var (
28
+ configPathOpt = flag.String("configPath", "", "Path to configuration file")
29
+ )
30
+
31
+ func main() {
32
+ logger, fs, runner, uuidGen := basicDeps()
33
+
34
+ defer logger.HandlePanic("Main")
35
+
36
+ flag.Parse()
37
+
38
+ config, err := NewConfigFromPath(*configPathOpt, fs)
39
+ if err != nil {
40
+ logger.Error(mainLogTag, "Loading config %s", err.Error())
41
+ os.Exit(1)
42
+ }
43
+
44
+ localBlobstore := boshblob.NewLocalBlobstore(
45
+ fs,
46
+ uuidGen,
47
+ config.Blobstore.Options,
48
+ )
49
+
50
+ blobstore := boshblob.NewSHA1VerifiableBlobstore(localBlobstore)
51
+
52
+ downloader := bpdload.NewDefaultMuxDownloader(blobstore, fs, logger)
53
+
54
+ extractor := bptar.NewCmdExtractor(runner, fs, logger)
55
+
56
+ compressor := bptar.NewCmdCompressor(runner, fs, logger)
57
+
58
+ renderedArchivesCompiler := bptplcomp.NewRenderedArchivesCompiler(
59
+ fs,
60
+ runner,
61
+ compressor,
62
+ logger,
63
+ )
64
+
65
+ jobReaderFactory := bpreljob.NewReaderFactory(
66
+ downloader,
67
+ extractor,
68
+ fs,
69
+ logger,
70
+ )
71
+
72
+ err = fs.MkdirAll(config.ReposDir, os.ModeDir)
73
+ if err != nil {
74
+ logger.Error(mainLogTag, "Failed to create repos dir %s", err.Error())
75
+ os.Exit(1)
76
+ }
77
+
78
+ reposFactory := NewReposFactory(config.ReposDir, fs, downloader, blobstore, logger)
79
+
80
+ blobstoreProvisioner := bpprov.NewBlobstoreProvisioner(
81
+ fs,
82
+ config.Blobstore,
83
+ logger,
84
+ )
85
+
86
+ err = blobstoreProvisioner.Provision()
87
+ if err != nil {
88
+ logger.Error(mainLogTag, "Failed to provision blobstore %s", err.Error())
89
+ os.Exit(1)
90
+ }
91
+
92
+ templatesCompiler := bptplcomp.NewConcreteTemplatesCompiler(
93
+ renderedArchivesCompiler,
94
+ jobReaderFactory,
95
+ reposFactory.NewJobsRepo(),
96
+ reposFactory.NewTemplateToJobRepo(),
97
+ reposFactory.NewRuntimePackagesRepo(),
98
+ reposFactory.NewTemplatesRepo(),
99
+ blobstore,
100
+ logger,
101
+ )
102
+
103
+ eventLog := bpeventlog.NewLog(logger)
104
+
105
+ packagesCompilerFactory := bppkgscomp.NewConcretePackagesCompilerFactory(
106
+ reposFactory.NewPackagesRepo(),
107
+ reposFactory.NewCompiledPackagesRepo(),
108
+ blobstore,
109
+ eventLog,
110
+ logger,
111
+ )
112
+
113
+ updaterFactory := bpinstupd.NewUpdaterFactory(
114
+ templatesCompiler,
115
+ packagesCompilerFactory,
116
+ eventLog,
117
+ logger,
118
+ )
119
+
120
+ releaseReaderFactory := bprel.NewReaderFactory(
121
+ downloader,
122
+ extractor,
123
+ fs,
124
+ logger,
125
+ )
126
+
127
+ deploymentReaderFactory := bpdep.NewReaderFactory(fs, logger)
128
+
129
+ vmProvisionerFactory := bpvm.NewVMProvisionerFactory(
130
+ fs,
131
+ runner,
132
+ config.AssetsDir,
133
+ config.Mbus,
134
+ config.Blobstore.AsMap(),
135
+ eventLog,
136
+ logger,
137
+ )
138
+
139
+ vmProvisioner := vmProvisionerFactory.NewVMProvisioner()
140
+
141
+ releaseCompiler := bpprov.NewReleaseCompiler(
142
+ reposFactory.NewBlobstoreReleasesRepo(),
143
+ releaseReaderFactory,
144
+ packagesCompilerFactory,
145
+ templatesCompiler,
146
+ vmProvisioner,
147
+ eventLog,
148
+ logger,
149
+ )
150
+
151
+ instanceProvisioner := bpprov.NewInstanceProvisioner(
152
+ updaterFactory,
153
+ vmProvisioner,
154
+ logger,
155
+ )
156
+
157
+ deploymentProvisioner := bpprov.NewDeploymentProvisioner(
158
+ config.ManifestPath,
159
+ deploymentReaderFactory,
160
+ releaseCompiler,
161
+ instanceProvisioner,
162
+ eventLog,
163
+ logger,
164
+ )
165
+
166
+ err = deploymentProvisioner.Provision()
167
+ if err != nil {
168
+ logger.Error(mainLogTag, "Failed to provision deployment %s", err.Error())
169
+ os.Exit(1)
170
+ }
171
+ }
172
+
173
+ func basicDeps() (boshlog.Logger, boshsys.FileSystem, boshsys.CmdRunner, boshuuid.Generator) {
174
+ logger := boshlog.NewWriterLogger(boshlog.LevelDebug, os.Stderr, os.Stderr)
175
+
176
+ fs := boshsys.NewOsFileSystem(logger)
177
+
178
+ runner := boshsys.NewExecCmdRunner(logger)
179
+
180
+ uuidGen := boshuuid.NewGenerator()
181
+
182
+ return logger, fs, runner, uuidGen
183
+ }
@@ -0,0 +1,96 @@
1
+ package main
2
+
3
+ import (
4
+ "path/filepath"
5
+
6
+ boshblob "bosh/blobstore"
7
+ boshlog "bosh/logger"
8
+ boshsys "bosh/system"
9
+
10
+ bpdload "boshprovisioner/downloader"
11
+ bpindex "boshprovisioner/index"
12
+ bpjobsrepo "boshprovisioner/instance/templatescompiler/jobsrepo"
13
+ bptplsrepo "boshprovisioner/instance/templatescompiler/templatesrepo"
14
+ bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
15
+ bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
16
+ bprelrepo "boshprovisioner/releasesrepo"
17
+ )
18
+
19
+ type ReposFactory struct {
20
+ dirPath string
21
+ fs boshsys.FileSystem
22
+ downloader bpdload.Downloader
23
+ blobstore boshblob.Blobstore
24
+ logger boshlog.Logger
25
+ }
26
+
27
+ func NewReposFactory(
28
+ dirPath string,
29
+ fs boshsys.FileSystem,
30
+ downloader bpdload.Downloader,
31
+ blobstore boshblob.Blobstore,
32
+ logger boshlog.Logger,
33
+ ) ReposFactory {
34
+ return ReposFactory{
35
+ dirPath: dirPath,
36
+ fs: fs,
37
+ downloader: downloader,
38
+ blobstore: blobstore,
39
+ logger: logger,
40
+ }
41
+ }
42
+
43
+ func (f ReposFactory) NewBlobstoreReleasesRepo() bprelrepo.BlobstoreReleasesRepository {
44
+ return bprelrepo.NewBlobstoreReleasesRepository(
45
+ f.downloader,
46
+ f.blobstore,
47
+ f.newIndex("releases"),
48
+ f.logger,
49
+ )
50
+ }
51
+
52
+ func (f ReposFactory) NewJobsRepo() bpjobsrepo.JobsRepository {
53
+ return bpjobsrepo.NewConcreteJobsRepository(
54
+ f.newIndex("jobs"),
55
+ f.logger,
56
+ )
57
+ }
58
+
59
+ func (f ReposFactory) NewTemplateToJobRepo() bpjobsrepo.TemplateToJobRepository {
60
+ return bpjobsrepo.NewConcreteTemplateToJobRepository(
61
+ f.newIndex("templates_to_job"),
62
+ f.logger,
63
+ )
64
+ }
65
+
66
+ func (f ReposFactory) NewRuntimePackagesRepo() bpjobsrepo.RuntimePackagesRepository {
67
+ return bpjobsrepo.NewConcreteRuntimePackagesRepository(
68
+ f.newIndex("runtime_packages"),
69
+ f.logger,
70
+ )
71
+ }
72
+
73
+ func (f ReposFactory) NewTemplatesRepo() bptplsrepo.TemplatesRepository {
74
+ return bptplsrepo.NewConcreteTemplatesRepository(
75
+ f.newIndex("templates"),
76
+ f.logger,
77
+ )
78
+ }
79
+
80
+ func (f ReposFactory) NewPackagesRepo() bppkgsrepo.PackagesRepository {
81
+ return bppkgsrepo.NewConcretePackagesRepository(
82
+ f.newIndex("packages"),
83
+ f.logger,
84
+ )
85
+ }
86
+
87
+ func (f ReposFactory) NewCompiledPackagesRepo() bpcpkgsrepo.CompiledPackagesRepository {
88
+ return bpcpkgsrepo.NewConcreteCompiledPackagesRepository(
89
+ f.newIndex("compiled_packages"),
90
+ f.logger,
91
+ )
92
+ }
93
+
94
+ func (f ReposFactory) newIndex(name string) bpindex.Index {
95
+ return bpindex.NewFileIndex(filepath.Join(f.dirPath, name+".json"), f.fs)
96
+ }
@@ -0,0 +1,17 @@
1
+ package compiledpackagesrepo
2
+
3
+ import (
4
+ bprel "boshprovisioner/release"
5
+ )
6
+
7
+ type CompiledPackageRecord struct {
8
+ BlobID string
9
+ SHA1 string
10
+ }
11
+
12
+ // CompiledPackagesRepository maintains list of compiled packages as blobs
13
+ // todo account for stemcell
14
+ type CompiledPackagesRepository interface {
15
+ Find(bprel.Package) (CompiledPackageRecord, bool, error)
16
+ Save(bprel.Package, CompiledPackageRecord) error
17
+ }
@@ -0,0 +1,61 @@
1
+ package compiledpackagesrepo
2
+
3
+ import (
4
+ bosherr "bosh/errors"
5
+ boshlog "bosh/logger"
6
+
7
+ bpindex "boshprovisioner/index"
8
+ bprel "boshprovisioner/release"
9
+ )
10
+
11
+ type CCPRepository struct {
12
+ index bpindex.Index
13
+ logger boshlog.Logger
14
+ }
15
+
16
+ type packageToCompiledPackageKey struct {
17
+ PackageName string
18
+ PackageVersion string
19
+
20
+ // Fingerprint of a package captures its dependenices
21
+ PackageFingerprint string
22
+ }
23
+
24
+ func NewConcreteCompiledPackagesRepository(
25
+ index bpindex.Index,
26
+ logger boshlog.Logger,
27
+ ) CCPRepository {
28
+ return CCPRepository{index: index, logger: logger}
29
+ }
30
+
31
+ func (r CCPRepository) Find(pkg bprel.Package) (CompiledPackageRecord, bool, error) {
32
+ var record CompiledPackageRecord
33
+
34
+ err := r.index.Find(r.pkgKey(pkg), &record)
35
+ if err != nil {
36
+ if err == bpindex.ErrNotFound {
37
+ return record, false, nil
38
+ }
39
+
40
+ return record, false, bosherr.WrapError(err, "Finding compiled package")
41
+ }
42
+
43
+ return record, true, nil
44
+ }
45
+
46
+ func (r CCPRepository) Save(pkg bprel.Package, record CompiledPackageRecord) error {
47
+ err := r.index.Save(r.pkgKey(pkg), record)
48
+ if err != nil {
49
+ return bosherr.WrapError(err, "Saving compiled package")
50
+ }
51
+
52
+ return nil
53
+ }
54
+
55
+ func (r CCPRepository) pkgKey(pkg bprel.Package) packageToCompiledPackageKey {
56
+ return packageToCompiledPackageKey{
57
+ PackageName: pkg.Name,
58
+ PackageVersion: pkg.Version,
59
+ PackageFingerprint: pkg.Fingerprint,
60
+ }
61
+ }