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.
- data/README.md +24 -1
- data/dev/Vagrantfile +7 -4
- data/dev/example-winston-manifest.yml +2 -2
- data/docs/build-aws-stemcell.md +66 -0
- data/docs/release-url.md +39 -0
- data/go/src/boshprovisioner/downloader/local_fs_downloader.go +1 -1
- data/go/src/boshprovisioner/main/config.go +28 -13
- data/go/src/boshprovisioner/main/config_test.go +67 -0
- data/go/src/boshprovisioner/main/main.go +7 -7
- data/go/src/boshprovisioner/main/main_suite_test.go +13 -0
- data/go/src/boshprovisioner/main/repos_factory.go +0 -10
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +3 -3
- data/go/src/boshprovisioner/provisioner/deployment_provisioner_interface.go +10 -0
- data/go/src/boshprovisioner/provisioner/release_compiler.go +11 -51
- data/go/src/boshprovisioner/provisioner/{deployment_provisioner.go → single_configured_vm_provisioner.go} +8 -12
- data/go/src/boshprovisioner/provisioner/single_non_configured_vm_provisioner.go +40 -0
- data/go/src/boshprovisioner/provisioner/single_vm_provisioner_factory.go +68 -0
- data/go/src/boshprovisioner/release/dir_reader.go +127 -0
- data/go/src/boshprovisioner/release/manifest/manifest.go +38 -14
- data/go/src/boshprovisioner/release/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/manifest/manifest_test.go +72 -0
- data/go/src/boshprovisioner/release/manifest/syntax_validator.go +134 -0
- data/go/src/boshprovisioner/release/reader_factory.go +13 -2
- data/go/src/boshprovisioner/release/reader_interface.go +6 -0
- data/go/src/boshprovisioner/release/tar_reader.go +26 -24
- data/go/src/boshprovisioner/vm/vagrant/agent_provisioner.go +70 -40
- data/go/src/boshprovisioner/vm/vagrant/asset_manager.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/configured_vm.go +29 -0
- data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +38 -24
- data/go/src/boshprovisioner/vm/vagrant/monit_provisioner.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/non_configured_vm.go +26 -0
- data/go/src/boshprovisioner/vm/vagrant/runit_provisioner.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/simple_cmds.go +1 -1
- data/go/src/boshprovisioner/vm/vagrant/vcap_user_provisioner.go +87 -40
- data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +58 -20
- data/go/src/boshprovisioner/vm/vagrant/vm_provisioner_factory.go +4 -7
- data/go/src/boshprovisioner/vm/vm_interface.go +25 -6
- data/lib/vagrant-bosh/asset_uploader.rb +4 -3
- data/lib/vagrant-bosh/assets/agent/agent-run +4 -1
- data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +34 -21
- data/lib/vagrant-bosh/communicator.rb +1 -0
- data/lib/vagrant-bosh/config.rb +25 -1
- data/lib/vagrant-bosh/deployment/manifest.rb +79 -0
- data/lib/vagrant-bosh/deployment/manifest_factory.rb +29 -0
- data/lib/vagrant-bosh/deployment/release_uploader.rb +40 -0
- data/lib/vagrant-bosh/deployment/uploadable_release.rb +82 -0
- data/lib/vagrant-bosh/deployment/uploadable_release_factory.rb +28 -0
- data/lib/vagrant-bosh/errors.rb +1 -3
- data/lib/vagrant-bosh/provisioner.rb +24 -5
- data/lib/vagrant-bosh/ui.rb +9 -7
- data/lib/vagrant-bosh/version.rb +1 -1
- data/templates/locales/en.yml +27 -0
- metadata +22 -7
- data/go/src/boshprovisioner/release/manifest_reader.go +0 -29
- data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +0 -114
- data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +0 -15
- 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 = "
|
11
|
-
config.vm.box_url = "
|
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
|
-
|
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
|
@@ -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.
|
data/docs/release-url.md
ADDED
@@ -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
|
+
```
|
@@ -10,9 +10,27 @@ import (
|
|
10
10
|
bpvm "boshprovisioner/vm"
|
11
11
|
)
|
12
12
|
|
13
|
-
|
14
|
-
|
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
|
-
|
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
|
}
|
@@ -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
|
-
|
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
|
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
|
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,
|
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
|
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
|
-
|
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,
|
115
|
-
|
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 :=
|
77
|
+
relRelease, err := relReader.Read()
|
118
78
|
if err != nil {
|
119
79
|
return bosherr.WrapError(err, "Reading release")
|
120
80
|
}
|
121
81
|
|
122
|
-
defer
|
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
|
-
|
14
|
-
|
15
|
-
|
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
|
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
|
-
)
|
38
|
-
return
|
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
|
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
|
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
|
|