vagrant-bosh 0.0.3 → 0.0.4

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 (59) hide show
  1. data/README.md +24 -1
  2. data/dev/Vagrantfile +7 -4
  3. data/dev/example-winston-manifest.yml +2 -2
  4. data/docs/build-aws-stemcell.md +66 -0
  5. data/docs/release-url.md +39 -0
  6. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +1 -1
  7. data/go/src/boshprovisioner/main/config.go +28 -13
  8. data/go/src/boshprovisioner/main/config_test.go +67 -0
  9. data/go/src/boshprovisioner/main/main.go +7 -7
  10. data/go/src/boshprovisioner/main/main_suite_test.go +13 -0
  11. data/go/src/boshprovisioner/main/repos_factory.go +0 -10
  12. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +3 -3
  13. data/go/src/boshprovisioner/provisioner/deployment_provisioner_interface.go +10 -0
  14. data/go/src/boshprovisioner/provisioner/release_compiler.go +11 -51
  15. data/go/src/boshprovisioner/provisioner/{deployment_provisioner.go → single_configured_vm_provisioner.go} +8 -12
  16. data/go/src/boshprovisioner/provisioner/single_non_configured_vm_provisioner.go +40 -0
  17. data/go/src/boshprovisioner/provisioner/single_vm_provisioner_factory.go +68 -0
  18. data/go/src/boshprovisioner/release/dir_reader.go +127 -0
  19. data/go/src/boshprovisioner/release/manifest/manifest.go +38 -14
  20. data/go/src/boshprovisioner/release/manifest/manifest_suite_test.go +13 -0
  21. data/go/src/boshprovisioner/release/manifest/manifest_test.go +72 -0
  22. data/go/src/boshprovisioner/release/manifest/syntax_validator.go +134 -0
  23. data/go/src/boshprovisioner/release/reader_factory.go +13 -2
  24. data/go/src/boshprovisioner/release/reader_interface.go +6 -0
  25. data/go/src/boshprovisioner/release/tar_reader.go +26 -24
  26. data/go/src/boshprovisioner/vm/vagrant/agent_provisioner.go +70 -40
  27. data/go/src/boshprovisioner/vm/vagrant/asset_manager.go +1 -1
  28. data/go/src/boshprovisioner/vm/vagrant/configured_vm.go +29 -0
  29. data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +38 -24
  30. data/go/src/boshprovisioner/vm/vagrant/monit_provisioner.go +1 -1
  31. data/go/src/boshprovisioner/vm/vagrant/non_configured_vm.go +26 -0
  32. data/go/src/boshprovisioner/vm/vagrant/runit_provisioner.go +1 -1
  33. data/go/src/boshprovisioner/vm/vagrant/simple_cmds.go +1 -1
  34. data/go/src/boshprovisioner/vm/vagrant/vcap_user_provisioner.go +87 -40
  35. data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +58 -20
  36. data/go/src/boshprovisioner/vm/vagrant/vm_provisioner_factory.go +4 -7
  37. data/go/src/boshprovisioner/vm/vm_interface.go +25 -6
  38. data/lib/vagrant-bosh/asset_uploader.rb +4 -3
  39. data/lib/vagrant-bosh/assets/agent/agent-run +4 -1
  40. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  41. data/lib/vagrant-bosh/assets/provisioner +0 -0
  42. data/lib/vagrant-bosh/bootstrapper.rb +34 -21
  43. data/lib/vagrant-bosh/communicator.rb +1 -0
  44. data/lib/vagrant-bosh/config.rb +25 -1
  45. data/lib/vagrant-bosh/deployment/manifest.rb +79 -0
  46. data/lib/vagrant-bosh/deployment/manifest_factory.rb +29 -0
  47. data/lib/vagrant-bosh/deployment/release_uploader.rb +40 -0
  48. data/lib/vagrant-bosh/deployment/uploadable_release.rb +82 -0
  49. data/lib/vagrant-bosh/deployment/uploadable_release_factory.rb +28 -0
  50. data/lib/vagrant-bosh/errors.rb +1 -3
  51. data/lib/vagrant-bosh/provisioner.rb +24 -5
  52. data/lib/vagrant-bosh/ui.rb +9 -7
  53. data/lib/vagrant-bosh/version.rb +1 -1
  54. data/templates/locales/en.yml +27 -0
  55. metadata +22 -7
  56. data/go/src/boshprovisioner/release/manifest_reader.go +0 -29
  57. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +0 -114
  58. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +0 -15
  59. data/go/src/boshprovisioner/vm/vagrant/vm.go +0 -27
data/README.md CHANGED
@@ -39,16 +39,39 @@ end
39
39
  ### Deployment manifest gotchas
40
40
 
41
41
  - It must specify release source(s) via `url` key in the `releases` section.
42
+ See [release URL confgurations](docs/release-url.md).
42
43
 
43
44
  - It must have exactly one deployment job; however, deployment job
44
45
  can be made up from multiple job templates that come from multiple releases.
45
46
 
46
- - It does not support `static` network type though `dynamic` network type is supported
47
+ - It does not support `static` network type, though `dynamic` network type is supported
47
48
  (Network configuration should be done via standard Vagrant configuration DSL).
48
49
 
49
50
  - It does not support stemcell specification because guest VM OS is picked via `config.vm.box` directive.
50
51
 
51
52
 
53
+ ### Provisioner options
54
+
55
+ - `manifest` (String, default: `nil`)
56
+ should contain full BOSH deployment manifest
57
+
58
+ - `full_stemcell_compatibility` (Boolean, default: `false`)
59
+ forces provisioner to install all (not just minimum) dependencies usually found on a stemcell
60
+
61
+ - `agent_infrastructure` (String, default: `warden`)
62
+ configures BOSH Agent infrastructure (e.g. `aws`, `openstack`)
63
+
64
+ - `agent_platform` (String, default: `ubuntu`)
65
+ configured BOSH Agent platform (e.g. `ubuntu`, `centos`)
66
+
67
+ - `agent_configuration` (Hash, default: '{ ... }')
68
+
69
+
70
+ ### Using BOSH provisioner to build BOSH stemcells
71
+
72
+ See [building AWS Stemcell](docs/build-aws-stemcell.md).
73
+
74
+
52
75
  ### Planned
53
76
 
54
77
  - Speed up apply step (Monit is sluggish)
data/dev/Vagrantfile CHANGED
@@ -7,8 +7,11 @@ end
7
7
  require "../lib/vagrant-bosh"
8
8
 
9
9
  Vagrant.configure("2") do |config|
10
- config.vm.box = "precise64"
11
- config.vm.box_url = "http://files.vagrantup.com/precise64.box"
10
+ config.vm.box = "saucy"
11
+ config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/saucy/current/saucy-server-cloudimg-amd64-vagrant-disk1.box"
12
+
13
+ # config.vm.box = "precise64"
14
+ # config.vm.box_url = "http://files.vagrantup.com/precise64.box"
12
15
 
13
16
  # Example port forward for example-bosh-manifest.yml
14
17
  config.vm.network "forwarded_port", guest: 25555, host: 25555 # BOSH Director API
@@ -24,7 +27,7 @@ Vagrant.configure("2") do |config|
24
27
  end
25
28
 
26
29
  config.vm.provision "bosh" do |c|
27
- # c.manifest = `cat example-bosh-manifest.yml`
28
- c.manifest = `cat example-winston-manifest.yml`
30
+ c.manifest = `cat example-bosh-manifest.yml`
31
+ # c.manifest = `cat example-winston-manifest.yml`
29
32
  end
30
33
  end
@@ -2,8 +2,8 @@ name: room101
2
2
 
3
3
  releases:
4
4
  - name: room101
5
- version: 0+dev.3
6
- url: file:///vagrant/room101-0+dev.3.tgz
5
+ version: latest
6
+ url: dir+bosh://../../room101
7
7
 
8
8
  networks:
9
9
  - name: room101
@@ -0,0 +1,66 @@
1
+ ## Building AWS BOSH stemcell with BOSH provisioner
2
+
3
+ !!! Stemcells produced using this method should NOT be used in production !!!
4
+
5
+ To quickly ligth BOSH stemcells for AWS:
6
+
7
+ 1. Configure AWS Vagrant provider with your AWS account settings. For example:
8
+
9
+ ```
10
+ # AWS provider is configured to use an AMI
11
+ config.vm.box = "dummy"
12
+
13
+ config.vm.provider "aws" do |aws, override|
14
+ aws.access_key_id = "AKIxxx"
15
+ aws.secret_access_key = "xxx"
16
+
17
+ aws.keypair_name = "my-aws-key-pair-name"
18
+ aws.security_groups = ['my-aws-sec-group']
19
+
20
+ aws.tags = { "Name" => "vagrant-bosh-stemcell" }
21
+
22
+ aws.block_device_mapping = [{
23
+ :DeviceName => "/dev/sda1",
24
+ "Ebs.VolumeSize" => 8
25
+ }]
26
+
27
+ # https://cloud-images.ubuntu.com/trusty/current/
28
+ aws.ami = "ami-018c9568"
29
+
30
+ override.ssh.username = "ubuntu"
31
+ override.ssh.private_key_path = "/Users/some-user/.ssh/my-aws-private-key"
32
+ end
33
+ ```
34
+
35
+ 2. Configure BOSH provisioner with following settings:
36
+
37
+ ```
38
+ config.vm.provision "bosh" do |c|
39
+ c.manifest = nil
40
+
41
+ # Some BOSH releases (e.g. cf-release) depend on more pre-installed packages
42
+ c.full_stemcell_compatibility = true
43
+
44
+ c.agent_infrastructure = "aws"
45
+ c.agent_platform = "ubuntu"
46
+ c.agent_configuration = {}
47
+ end
48
+ ```
49
+
50
+ 3. Remove `cloud-init` package included by default in Ubuntu AMIs
51
+ to avoid conflicts with BOSH Agent auto configuration:
52
+
53
+ ```
54
+ config.vm.provision "shell", inline: "apt-get -y purge --auto-remove cloud-init"
55
+ config.vm.provision "shell", inline: "echo 'LABEL=cloudimg-rootfs / ext4 defaults 0 0' > /etc/fstab"
56
+ ```
57
+
58
+ 4. `vagrant up --provider aws`
59
+
60
+ 5. Once VM is provisioned, in AWS Console right-click on the VM and select `Cerate image` to create an AMI.
61
+ Optionally make AMI public by changing its permissions if stemcell will be used from a different AWS account.
62
+
63
+ 6. Unpack one of the officially published `ligth-bosh` stemcells and
64
+ update `stemcell.MF` with new AMI reference, then repack.
65
+
66
+ 7. Upload your new light stemcell to a BOSH Director and use it in your deployment.
@@ -0,0 +1,39 @@
1
+ ## Release URL configurations
2
+
3
+ - `https/http`: Download release tar from the URL. Exact version (dev or final) must be specified.
4
+
5
+ ```
6
+ releases:
7
+ - name: bosh
8
+ version: 88
9
+ url: https://s3.amazonaws.com/bosh-jenkins-artifacts/release/bosh-2619.tgz
10
+ ```
11
+
12
+ - `dir+bosh`: Use release directory located on the _host_ FS.
13
+ Exact dev release version or `latest` must be specified.
14
+ If version is `latest` new dev release will be created via `bosh create release --force`.
15
+
16
+ ```
17
+ releases:
18
+ - name: bosh
19
+ version: latest
20
+ url: dir+bosh://../../bosh
21
+ ```
22
+
23
+ - `dir`: Use release directory located on the _guest_ FS. Exact dev release version must be specified.
24
+
25
+ ```
26
+ releases:
27
+ - name: bosh
28
+ version: 88+dev.1
29
+ url: dir:///tmp/bosh
30
+ ```
31
+
32
+ - `file`: Use release tar located on the _guest_ FS. Exact version (dev or final) must be specified.
33
+
34
+ ```
35
+ releases:
36
+ - name: bosh
37
+ version: 88
38
+ url: file:///tmp/bosh-2619.tgz
39
+ ```
@@ -8,7 +8,7 @@ import (
8
8
  boshsys "bosh/system"
9
9
  )
10
10
 
11
- const localFSDownloaderLogTag = "Downloader"
11
+ const localFSDownloaderLogTag = "LocalFSDownloader"
12
12
 
13
13
  type LocalFSDownloader struct {
14
14
  fs boshsys.FileSystem
@@ -10,9 +10,27 @@ import (
10
10
  bpvm "boshprovisioner/vm"
11
11
  )
12
12
 
13
- type Config struct {
14
- ManifestPath string `json:"manifest_path"`
13
+ var DefaultWardenConfig = Config{
14
+ VMProvisioner: bpvm.VMProvisionerConfig{
15
+ AgentProvisioner: bpvm.AgentProvisionerConfig{
16
+ Infrastructure: "warden",
17
+ Platform: "ubuntu",
18
+ Mbus: "https://user:password@127.0.0.1:4321/agent",
19
+ },
20
+ },
21
+ }
22
+
23
+ var DefaultWardenAgentConfiguration = map[string]interface{}{
24
+ "Platform": map[string]interface{}{
25
+ "Linux": map[string]interface{}{
26
+ "UseDefaultTmpDir": true,
27
+ "UsePreformattedPersistentDisk": true,
28
+ "BindMountPersistentDisk": true,
29
+ },
30
+ },
31
+ }
15
32
 
33
+ type Config struct {
16
34
  // Assets dir is used as a temporary location to transfer files from host to guest.
17
35
  // It will not be created since assets already must be present.
18
36
  AssetsDir string `json:"assets_dir"`
@@ -21,12 +39,11 @@ type Config struct {
21
39
  // It will be created if it does not exist.
22
40
  ReposDir string `json:"repos_dir"`
23
41
 
24
- // e.g. "https://user:password@127.0.0.1:4321/agent"
25
- Mbus string `json:"mbus"`
26
-
27
42
  Blobstore bpprov.BlobstoreConfig `json:"blobstore"`
28
43
 
29
44
  VMProvisioner bpvm.VMProvisionerConfig `json:"vm_provisioner"`
45
+
46
+ DeploymentProvisioner bpprov.DeploymentProvisionerConfig `json:"deployment_provisioner"`
30
47
  }
31
48
 
32
49
  func NewConfigFromPath(path string, fs boshsys.FileSystem) (Config, error) {
@@ -37,11 +54,17 @@ func NewConfigFromPath(path string, fs boshsys.FileSystem) (Config, error) {
37
54
  return config, bosherr.WrapError(err, "Reading config %s", path)
38
55
  }
39
56
 
57
+ config = DefaultWardenConfig
58
+
40
59
  err = json.Unmarshal(bytes, &config)
41
60
  if err != nil {
42
61
  return config, bosherr.WrapError(err, "Unmarshalling config")
43
62
  }
44
63
 
64
+ if config.VMProvisioner.AgentProvisioner.Configuration == nil {
65
+ config.VMProvisioner.AgentProvisioner.Configuration = DefaultWardenAgentConfiguration
66
+ }
67
+
45
68
  err = config.validate()
46
69
  if err != nil {
47
70
  return config, bosherr.WrapError(err, "Validating config")
@@ -51,10 +74,6 @@ func NewConfigFromPath(path string, fs boshsys.FileSystem) (Config, error) {
51
74
  }
52
75
 
53
76
  func (c Config) validate() error {
54
- if c.ManifestPath == "" {
55
- return bosherr.New("Must provide non-empty manifest_path")
56
- }
57
-
58
77
  if c.AssetsDir == "" {
59
78
  return bosherr.New("Must provide non-empty assets_dir")
60
79
  }
@@ -63,10 +82,6 @@ func (c Config) validate() error {
63
82
  return bosherr.New("Must provide non-empty repos_dir")
64
83
  }
65
84
 
66
- if c.Mbus == "" {
67
- return bosherr.New("Must provide non-empty mbus")
68
- }
69
-
70
85
  if c.Blobstore.Type != bpprov.BlobstoreConfigTypeLocal {
71
86
  return bosherr.New("Blobstore type must be local")
72
87
  }
@@ -0,0 +1,67 @@
1
+ package main_test
2
+
3
+ import (
4
+ fakesys "bosh/system/fakes"
5
+ . "github.com/onsi/ginkgo"
6
+ . "github.com/onsi/gomega"
7
+
8
+ . "boshprovisioner/main"
9
+ bpvm "boshprovisioner/vm"
10
+ )
11
+
12
+ var _ = Describe("NewConfigFromPath", func() {
13
+ var (
14
+ fs *fakesys.FakeFileSystem
15
+ )
16
+
17
+ BeforeEach(func() {
18
+ fs = fakesys.NewFakeFileSystem()
19
+ })
20
+
21
+ It("defautls null values to agent provisioner config defaults", func() {
22
+ configJSON := `{
23
+ "manifest_path": "fake-manifest-path",
24
+ "assets_dir": "fake-assets-dir",
25
+ "repos_dir": "fake-repos-dir",
26
+ "blobstore": {
27
+ "provider": "local",
28
+ "options": {
29
+ "blobstore_path": "fake-blobstore-path"
30
+ }
31
+ },
32
+ "vm_provisioner": {
33
+ "agent_provisioner": {
34
+ "infrastructure": null,
35
+ "platform": null,
36
+ "configuration": null,
37
+ "mbus": null
38
+ }
39
+ }
40
+ }`
41
+
42
+ err := fs.WriteFileString("/tmp/config", configJSON)
43
+ Expect(err).ToNot(HaveOccurred())
44
+
45
+ config, err := NewConfigFromPath("/tmp/config", fs)
46
+ Expect(err).ToNot(HaveOccurred())
47
+
48
+ Expect(config.VMProvisioner.AgentProvisioner).To(Equal(
49
+ bpvm.AgentProvisionerConfig{
50
+ Infrastructure: "warden",
51
+ Platform: "ubuntu",
52
+
53
+ Configuration: map[string]interface{}{
54
+ "Platform": map[string]interface{}{
55
+ "Linux": map[string]interface{}{
56
+ "UseDefaultTmpDir": true,
57
+ "UsePreformattedPersistentDisk": true,
58
+ "BindMountPersistentDisk": true,
59
+ },
60
+ },
61
+ },
62
+
63
+ Mbus: "https://user:password@127.0.0.1:4321/agent",
64
+ },
65
+ ))
66
+ })
67
+ })
@@ -72,7 +72,7 @@ func main() {
72
72
 
73
73
  err = fs.MkdirAll(config.ReposDir, os.ModeDir)
74
74
  if err != nil {
75
- logger.Error(mainLogTag, "Failed to create repos dir %s", err.Error())
75
+ logger.Error(mainLogTag, "Failed to create repos dir: %s", err.Error())
76
76
  os.Exit(1)
77
77
  }
78
78
 
@@ -86,7 +86,7 @@ func main() {
86
86
 
87
87
  err = blobstoreProvisioner.Provision()
88
88
  if err != nil {
89
- logger.Error(mainLogTag, "Failed to provision blobstore %s", err.Error())
89
+ logger.Error(mainLogTag, "Failed to provision blobstore: %s", err.Error())
90
90
  os.Exit(1)
91
91
  }
92
92
 
@@ -131,7 +131,6 @@ func main() {
131
131
  fs,
132
132
  runner,
133
133
  config.AssetsDir,
134
- config.Mbus,
135
134
  config.Blobstore.AsMap(),
136
135
  config.VMProvisioner,
137
136
  eventLog,
@@ -141,7 +140,6 @@ func main() {
141
140
  vagrantVMProvisioner := vagrantVMProvisionerFactory.NewVMProvisioner()
142
141
 
143
142
  releaseCompiler := bpprov.NewReleaseCompiler(
144
- reposFactory.NewBlobstoreReleasesRepo(),
145
143
  releaseReaderFactory,
146
144
  packagesCompilerFactory,
147
145
  templatesCompiler,
@@ -155,9 +153,9 @@ func main() {
155
153
  logger,
156
154
  )
157
155
 
158
- deploymentProvisioner := bpprov.NewDeploymentProvisioner(
159
- config.ManifestPath,
156
+ singleVMProvisionerFactory := bpprov.NewSingleVMProvisionerFactory(
160
157
  deploymentReaderFactory,
158
+ config.DeploymentProvisioner,
161
159
  vagrantVMProvisioner,
162
160
  releaseCompiler,
163
161
  instanceProvisioner,
@@ -165,9 +163,11 @@ func main() {
165
163
  logger,
166
164
  )
167
165
 
166
+ deploymentProvisioner := singleVMProvisionerFactory.NewSingleVMProvisioner()
167
+
168
168
  err = deploymentProvisioner.Provision()
169
169
  if err != nil {
170
- logger.Error(mainLogTag, "Failed to provision deployment %s", err.Error())
170
+ logger.Error(mainLogTag, "Failed to provision deployment: %s", err.Error())
171
171
  os.Exit(1)
172
172
  }
173
173
  }
@@ -0,0 +1,13 @@
1
+ package main_test
2
+
3
+ import (
4
+ . "github.com/onsi/ginkgo"
5
+ . "github.com/onsi/gomega"
6
+
7
+ "testing"
8
+ )
9
+
10
+ func TestMain(t *testing.T) {
11
+ RegisterFailHandler(Fail)
12
+ RunSpecs(t, "Main Suite")
13
+ }
@@ -13,7 +13,6 @@ import (
13
13
  bptplsrepo "boshprovisioner/instance/templatescompiler/templatesrepo"
14
14
  bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
15
15
  bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
16
- bprelrepo "boshprovisioner/releasesrepo"
17
16
  )
18
17
 
19
18
  type ReposFactory struct {
@@ -40,15 +39,6 @@ func NewReposFactory(
40
39
  }
41
40
  }
42
41
 
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
42
  func (f ReposFactory) NewJobsRepo() bpjobsrepo.JobsRepository {
53
43
  return bpjobsrepo.NewConcreteJobsRepository(
54
44
  f.newIndex("jobs"),
@@ -8,7 +8,7 @@ import (
8
8
  bosherr "bosh/errors"
9
9
  boshlog "bosh/logger"
10
10
 
11
- bragentclient "boshprovisioner/agent/client"
11
+ bpagentclient "boshprovisioner/agent/client"
12
12
  bpeventlog "boshprovisioner/eventlog"
13
13
  bpcpkgsrepo "boshprovisioner/packagescompiler/compiledpackagesrepo"
14
14
  bppkgsrepo "boshprovisioner/packagescompiler/packagesrepo"
@@ -18,7 +18,7 @@ import (
18
18
  const concretePackagesCompilerLogTag = "ConcretePackagesCompiler"
19
19
 
20
20
  type ConcretePackagesCompiler struct {
21
- agentClient bragentclient.Client
21
+ agentClient bpagentclient.Client
22
22
  packagesRepo bppkgsrepo.PackagesRepository
23
23
  compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository
24
24
  blobstore boshblob.Blobstore
@@ -28,7 +28,7 @@ type ConcretePackagesCompiler struct {
28
28
  }
29
29
 
30
30
  func NewConcretePackagesCompiler(
31
- agentClient bragentclient.Client,
31
+ agentClient bpagentclient.Client,
32
32
  packagesRepo bppkgsrepo.PackagesRepository,
33
33
  compiledPackagesRepo bpcpkgsrepo.CompiledPackagesRepository,
34
34
  blobstore boshblob.Blobstore,
@@ -0,0 +1,10 @@
1
+ package provisioner
2
+
3
+ type DeploymentProvisioner interface {
4
+ Provision() error
5
+ }
6
+
7
+ type DeploymentProvisionerConfig struct {
8
+ // If manifest path is empty, release compilation and job provisioning will be skipped
9
+ ManifestPath string `json:"manifest_path"`
10
+ }
@@ -1,8 +1,6 @@
1
1
  package provisioner
2
2
 
3
3
  import (
4
- "fmt"
5
-
6
4
  bosherr "bosh/errors"
7
5
  boshlog "bosh/logger"
8
6
 
@@ -11,14 +9,12 @@ import (
11
9
  bptplcomp "boshprovisioner/instance/templatescompiler"
12
10
  bppkgscomp "boshprovisioner/packagescompiler"
13
11
  bprel "boshprovisioner/release"
14
- bprelrepo "boshprovisioner/releasesrepo"
15
12
  bpvm "boshprovisioner/vm"
16
13
  )
17
14
 
18
15
  const releaseCompilerLogTag = "ReleaseCompiler"
19
16
 
20
17
  type ReleaseCompiler struct {
21
- releasesRepo bprelrepo.ReleasesRepository
22
18
  releaseReaderFactory bprel.ReaderFactory
23
19
 
24
20
  packagesCompilerFactory bppkgscomp.ConcretePackagesCompilerFactory
@@ -31,7 +27,6 @@ type ReleaseCompiler struct {
31
27
  }
32
28
 
33
29
  func NewReleaseCompiler(
34
- releasesRepo bprelrepo.ReleasesRepository,
35
30
  releaseReaderFactory bprel.ReaderFactory,
36
31
  packagesCompilerFactory bppkgscomp.ConcretePackagesCompilerFactory,
37
32
  templatesCompiler bptplcomp.TemplatesCompiler,
@@ -40,7 +35,6 @@ func NewReleaseCompiler(
40
35
  logger boshlog.Logger,
41
36
  ) ReleaseCompiler {
42
37
  return ReleaseCompiler{
43
- releasesRepo: releasesRepo,
44
38
  releaseReaderFactory: releaseReaderFactory,
45
39
 
46
40
  packagesCompilerFactory: packagesCompilerFactory,
@@ -53,55 +47,17 @@ func NewReleaseCompiler(
53
47
  }
54
48
  }
55
49
 
56
- func (p ReleaseCompiler) Compile(instance bpdep.Instance, releases []bpdep.Release) error {
50
+ func (p ReleaseCompiler) Compile(instance bpdep.Instance, depReleases []bpdep.Release) error {
57
51
  vm, err := p.vmProvisioner.Provision(instance)
58
52
  if err != nil {
59
- return bosherr.WrapError(err, "Provisioning agent")
53
+ return bosherr.WrapError(err, "Provisioning VM")
60
54
  }
61
55
 
62
56
  defer vm.Deprovision()
63
57
 
64
- err = p.uploadReleases(releases)
65
- if err != nil {
66
- return bosherr.WrapError(err, "Uploading releases")
67
- }
68
-
69
58
  pkgsCompiler := p.packagesCompilerFactory.NewCompiler(vm.AgentClient())
70
59
 
71
- err = p.compileReleases(pkgsCompiler, releases)
72
- if err != nil {
73
- return bosherr.WrapError(err, "Compiling releases")
74
- }
75
-
76
- return nil
77
- }
78
-
79
- func (p ReleaseCompiler) uploadReleases(releases []bpdep.Release) error {
80
- stage := p.eventLog.BeginStage("Uploading releases", len(releases)+1)
81
-
82
- for _, depRelease := range releases {
83
- releaseDesc := fmt.Sprintf("%s/%s", depRelease.Name, depRelease.Version)
84
-
85
- task := stage.BeginTask(fmt.Sprintf("Release %s", releaseDesc))
86
-
87
- err := task.End(p.releasesRepo.Pull(depRelease))
88
- if err != nil {
89
- return bosherr.WrapError(err, "Pulling release %s", depRelease.Name)
90
- }
91
- }
92
-
93
- task := stage.BeginTask("Deleting old releases")
94
-
95
- err := task.End(p.releasesRepo.KeepOnly(releases))
96
- if err != nil {
97
- return bosherr.WrapError(err, "Keeping only releases")
98
- }
99
-
100
- return nil
101
- }
102
-
103
- func (p ReleaseCompiler) compileReleases(pkgsCompiler bppkgscomp.PackagesCompiler, releases []bpdep.Release) error {
104
- for _, depRelease := range releases {
60
+ for _, depRelease := range depReleases {
105
61
  err := p.compileRelease(pkgsCompiler, depRelease)
106
62
  if err != nil {
107
63
  return bosherr.WrapError(err, "Release %s", depRelease.Name)
@@ -111,15 +67,19 @@ func (p ReleaseCompiler) compileReleases(pkgsCompiler bppkgscomp.PackagesCompile
111
67
  return nil
112
68
  }
113
69
 
114
- func (p ReleaseCompiler) compileRelease(pkgsCompiler bppkgscomp.PackagesCompiler, release bpdep.Release) error {
115
- reader := p.releaseReaderFactory.NewTarReader(release.URL)
70
+ func (p ReleaseCompiler) compileRelease(pkgsCompiler bppkgscomp.PackagesCompiler, depRelease bpdep.Release) error {
71
+ relReader := p.releaseReaderFactory.NewReader(
72
+ depRelease.Name,
73
+ depRelease.Version,
74
+ depRelease.URL,
75
+ )
116
76
 
117
- relRelease, err := reader.Read()
77
+ relRelease, err := relReader.Read()
118
78
  if err != nil {
119
79
  return bosherr.WrapError(err, "Reading release")
120
80
  }
121
81
 
122
- defer reader.Close()
82
+ defer relReader.Close()
123
83
 
124
84
  err = pkgsCompiler.Compile(relRelease)
125
85
  if err != nil {
@@ -10,11 +10,9 @@ import (
10
10
  bpvm "boshprovisioner/vm"
11
11
  )
12
12
 
13
- const deploymentProvisionerLogTag = "DeploymentProvisioner"
14
-
15
- // DeploymentProvisioner interprets deployment manifest and
16
- // configures system just like regular BOSH VM would be configured.
17
- type DeploymentProvisioner struct {
13
+ // SingleConfiguredVMProvisioner interprets deployment manifest and
14
+ // configures 1 VM just like regular BOSH VM.
15
+ type SingleConfiguredVMProvisioner struct {
18
16
  manifestPath string
19
17
  deploymentReaderFactory bpdep.ReaderFactory
20
18
 
@@ -26,7 +24,7 @@ type DeploymentProvisioner struct {
26
24
  logger boshlog.Logger
27
25
  }
28
26
 
29
- func NewDeploymentProvisioner(
27
+ func NewSingleConfiguredVMProvisioner(
30
28
  manifestPath string,
31
29
  deploymentReaderFactory bpdep.ReaderFactory,
32
30
  vmProvisioner bpvm.VMProvisioner,
@@ -34,8 +32,8 @@ func NewDeploymentProvisioner(
34
32
  instanceProvisioner bpinstance.InstanceProvisioner,
35
33
  eventLog bpeventlog.Log,
36
34
  logger boshlog.Logger,
37
- ) DeploymentProvisioner {
38
- return DeploymentProvisioner{
35
+ ) SingleConfiguredVMProvisioner {
36
+ return SingleConfiguredVMProvisioner{
39
37
  manifestPath: manifestPath,
40
38
  deploymentReaderFactory: deploymentReaderFactory,
41
39
 
@@ -48,7 +46,7 @@ func NewDeploymentProvisioner(
48
46
  }
49
47
  }
50
48
 
51
- func (p DeploymentProvisioner) Provision() error {
49
+ func (p SingleConfiguredVMProvisioner) Provision() error {
52
50
  stage := p.eventLog.BeginStage("Setting up instance", 2)
53
51
 
54
52
  reader := p.deploymentReaderFactory.NewManifestReader(p.manifestPath)
@@ -106,9 +104,7 @@ func (p DeploymentProvisioner) Provision() error {
106
104
  return nil
107
105
  }
108
106
 
109
- func (p DeploymentProvisioner) validateInstance(deployment bpdep.Deployment) (bpdep.Job, bpdep.Instance, error) {
110
- p.logger.Debug(deploymentProvisionerLogTag, "Validate instance")
111
-
107
+ func (p SingleConfiguredVMProvisioner) validateInstance(deployment bpdep.Deployment) (bpdep.Job, bpdep.Instance, error) {
112
108
  var job bpdep.Job
113
109
  var instance bpdep.Instance
114
110