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.
- 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
|
|