vagrant-bosh 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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