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
@@ -0,0 +1,40 @@
|
|
1
|
+
package provisioner
|
2
|
+
|
3
|
+
import (
|
4
|
+
bosherr "bosh/errors"
|
5
|
+
boshlog "bosh/logger"
|
6
|
+
|
7
|
+
bpeventlog "boshprovisioner/eventlog"
|
8
|
+
bpvm "boshprovisioner/vm"
|
9
|
+
)
|
10
|
+
|
11
|
+
// SingleNonConfiguredVMProvisioner configures 1 VM as a regular empty BOSH VM.
|
12
|
+
type SingleNonConfiguredVMProvisioner struct {
|
13
|
+
vmProvisioner bpvm.VMProvisioner
|
14
|
+
eventLog bpeventlog.Log
|
15
|
+
logger boshlog.Logger
|
16
|
+
}
|
17
|
+
|
18
|
+
func NewSingleNonConfiguredVMProvisioner(
|
19
|
+
vmProvisioner bpvm.VMProvisioner,
|
20
|
+
eventLog bpeventlog.Log,
|
21
|
+
logger boshlog.Logger,
|
22
|
+
) SingleNonConfiguredVMProvisioner {
|
23
|
+
return SingleNonConfiguredVMProvisioner{
|
24
|
+
vmProvisioner: vmProvisioner,
|
25
|
+
eventLog: eventLog,
|
26
|
+
logger: logger,
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
func (p SingleNonConfiguredVMProvisioner) Provision() error {
|
31
|
+
// todo VM was possibly provisioned last time
|
32
|
+
_, err := p.vmProvisioner.ProvisionNonConfigured()
|
33
|
+
if err != nil {
|
34
|
+
return bosherr.WrapError(err, "Provisioning VM")
|
35
|
+
}
|
36
|
+
|
37
|
+
// Do not Deprovision() VM to keep instance running
|
38
|
+
|
39
|
+
return nil
|
40
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
package provisioner
|
2
|
+
|
3
|
+
import (
|
4
|
+
boshlog "bosh/logger"
|
5
|
+
|
6
|
+
bpdep "boshprovisioner/deployment"
|
7
|
+
bpeventlog "boshprovisioner/eventlog"
|
8
|
+
bpinstance "boshprovisioner/instance"
|
9
|
+
bpvm "boshprovisioner/vm"
|
10
|
+
)
|
11
|
+
|
12
|
+
type SingleVMProvisionerFactory struct {
|
13
|
+
deploymentReaderFactory bpdep.ReaderFactory
|
14
|
+
deploymentProvisionerConfig DeploymentProvisionerConfig
|
15
|
+
|
16
|
+
vmProvisioner bpvm.VMProvisioner
|
17
|
+
releaseCompiler ReleaseCompiler
|
18
|
+
instanceProvisioner bpinstance.InstanceProvisioner
|
19
|
+
|
20
|
+
eventLog bpeventlog.Log
|
21
|
+
logger boshlog.Logger
|
22
|
+
}
|
23
|
+
|
24
|
+
func NewSingleVMProvisionerFactory(
|
25
|
+
deploymentReaderFactory bpdep.ReaderFactory,
|
26
|
+
deploymentProvisionerConfig DeploymentProvisionerConfig,
|
27
|
+
vmProvisioner bpvm.VMProvisioner,
|
28
|
+
releaseCompiler ReleaseCompiler,
|
29
|
+
instanceProvisioner bpinstance.InstanceProvisioner,
|
30
|
+
eventLog bpeventlog.Log,
|
31
|
+
logger boshlog.Logger,
|
32
|
+
) SingleVMProvisionerFactory {
|
33
|
+
return SingleVMProvisionerFactory{
|
34
|
+
deploymentReaderFactory: deploymentReaderFactory,
|
35
|
+
deploymentProvisionerConfig: deploymentProvisionerConfig,
|
36
|
+
|
37
|
+
vmProvisioner: vmProvisioner,
|
38
|
+
releaseCompiler: releaseCompiler,
|
39
|
+
instanceProvisioner: instanceProvisioner,
|
40
|
+
|
41
|
+
eventLog: eventLog,
|
42
|
+
logger: logger,
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
func (f SingleVMProvisionerFactory) NewSingleVMProvisioner() DeploymentProvisioner {
|
47
|
+
var prov DeploymentProvisioner
|
48
|
+
|
49
|
+
if len(f.deploymentProvisionerConfig.ManifestPath) > 0 {
|
50
|
+
prov = NewSingleConfiguredVMProvisioner(
|
51
|
+
f.deploymentProvisionerConfig.ManifestPath,
|
52
|
+
f.deploymentReaderFactory,
|
53
|
+
f.vmProvisioner,
|
54
|
+
f.releaseCompiler,
|
55
|
+
f.instanceProvisioner,
|
56
|
+
f.eventLog,
|
57
|
+
f.logger,
|
58
|
+
)
|
59
|
+
} else {
|
60
|
+
prov = NewSingleNonConfiguredVMProvisioner(
|
61
|
+
f.vmProvisioner,
|
62
|
+
f.eventLog,
|
63
|
+
f.logger,
|
64
|
+
)
|
65
|
+
}
|
66
|
+
|
67
|
+
return prov
|
68
|
+
}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
package release
|
2
|
+
|
3
|
+
import (
|
4
|
+
"path/filepath"
|
5
|
+
|
6
|
+
bosherr "bosh/errors"
|
7
|
+
boshlog "bosh/logger"
|
8
|
+
boshsys "bosh/system"
|
9
|
+
|
10
|
+
bprelman "boshprovisioner/release/manifest"
|
11
|
+
)
|
12
|
+
|
13
|
+
const dirReaderLogTag = "DirReader"
|
14
|
+
|
15
|
+
type DirReader struct {
|
16
|
+
releaseName string // e.g. room101
|
17
|
+
releaseVersion string // e.g. 0+dev.16
|
18
|
+
dir string
|
19
|
+
|
20
|
+
fs boshsys.FileSystem
|
21
|
+
logger boshlog.Logger
|
22
|
+
}
|
23
|
+
|
24
|
+
func NewDirReader(
|
25
|
+
releaseName string,
|
26
|
+
releaseVersion string,
|
27
|
+
dir string,
|
28
|
+
fs boshsys.FileSystem,
|
29
|
+
logger boshlog.Logger,
|
30
|
+
) DirReader {
|
31
|
+
return DirReader{
|
32
|
+
releaseName: releaseName,
|
33
|
+
releaseVersion: releaseVersion,
|
34
|
+
dir: dir,
|
35
|
+
|
36
|
+
fs: fs,
|
37
|
+
logger: logger,
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
func (r DirReader) Read() (Release, error) {
|
42
|
+
var release Release
|
43
|
+
|
44
|
+
// e.g. room101-0+dev.16.yml
|
45
|
+
manifestFileName := r.releaseName + "-" + r.releaseVersion + ".yml"
|
46
|
+
|
47
|
+
manifestPath := filepath.Join(r.dir, "dev_releases", manifestFileName)
|
48
|
+
|
49
|
+
manifest, err := bprelman.NewManifestFromPath(manifestPath, r.fs)
|
50
|
+
if err != nil {
|
51
|
+
closeErr := r.Close()
|
52
|
+
if closeErr != nil {
|
53
|
+
r.logger.Debug(dirReaderLogTag,
|
54
|
+
"Failed to close release %v", closeErr)
|
55
|
+
}
|
56
|
+
|
57
|
+
return release, bosherr.WrapError(err, "Building manifest")
|
58
|
+
}
|
59
|
+
|
60
|
+
r.logger.Debug(dirReaderLogTag, "Done building manifest %#v", manifest)
|
61
|
+
|
62
|
+
release.populateFromManifest(manifest)
|
63
|
+
|
64
|
+
r.populateReleaseTarPaths(&release)
|
65
|
+
|
66
|
+
return release, nil
|
67
|
+
}
|
68
|
+
|
69
|
+
func (r DirReader) Close() error {
|
70
|
+
// Caller owns release directory; hence, nothing to clean up
|
71
|
+
return nil
|
72
|
+
}
|
73
|
+
|
74
|
+
// populateReleaseTarPaths sets TarPath for each job/package in the release.
|
75
|
+
func (r DirReader) populateReleaseTarPaths(release *Release) {
|
76
|
+
for i, job := range release.Jobs {
|
77
|
+
fileName := job.Fingerprint + ".tgz"
|
78
|
+
|
79
|
+
release.Jobs[i].TarPath = filepath.Join(
|
80
|
+
r.dir, ".dev_builds", "jobs", job.Name, fileName)
|
81
|
+
}
|
82
|
+
|
83
|
+
for _, pkg := range release.Packages {
|
84
|
+
fileName := pkg.Fingerprint + ".tgz"
|
85
|
+
|
86
|
+
pkg.TarPath = filepath.Join(
|
87
|
+
r.dir, ".dev_builds", "packages", pkg.Name, fileName)
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
/*
|
92
|
+
Example of BOSH release director with created dev releases:
|
93
|
+
|
94
|
+
$ tree ~/Downloads/room101-release
|
95
|
+
~/Downloads/room101-release
|
96
|
+
├── .dev_builds/
|
97
|
+
│ ├── jobs
|
98
|
+
│ │ ├── warden
|
99
|
+
│ │ │ ├── 2a2b0559a97f869274602ffed008827cd66d15c3.tgz
|
100
|
+
│ │ │ └── index.yml
|
101
|
+
│ │ └── winston
|
102
|
+
│ │ ├── 98facd269cd8096a9b0ad354cbb5f0fc4265006f.tgz
|
103
|
+
│ │ └── index.yml
|
104
|
+
│ └── packages
|
105
|
+
│ ├── aufs
|
106
|
+
│ │ ├── cc5b6bf395c60d2aba6e0bc1ceeb613e7aadb52b.tgz
|
107
|
+
│ │ └── index.yml
|
108
|
+
│ ├── golang_1.2
|
109
|
+
│ │ ├── ac825cab297fba938bec25c83f4a5780f88cdc92.tgz
|
110
|
+
│ │ └── index.yml
|
111
|
+
│ ├── iptables
|
112
|
+
│ │ ├── 7226d311e90f49b05287e79f339581a1de9ea82e.tgz
|
113
|
+
│ │ └── index.yml
|
114
|
+
│ ├── pid_utils
|
115
|
+
│ │ ├── de523512921338bac845ea7230e30b4307f842e7.tgz
|
116
|
+
│ │ └── index.yml
|
117
|
+
│ ├── warden-linux
|
118
|
+
│ │ ├── 3f90138dae6c92c3e4595742ab6a513560e32a4c.tgz
|
119
|
+
│ │ └── index.yml
|
120
|
+
│ └── winston
|
121
|
+
│ ├── 69fcbe3ef485a7f9d7c8efa6f18a74a0cffcb213.tgz
|
122
|
+
│ └── index.yml
|
123
|
+
└── dev_releases
|
124
|
+
├── index.yml
|
125
|
+
├── room101-0+dev.1.yml
|
126
|
+
└── room101-0+dev.2.yml
|
127
|
+
*/
|
@@ -23,21 +23,31 @@ type Release struct {
|
|
23
23
|
}
|
24
24
|
|
25
25
|
type Job struct {
|
26
|
-
Name
|
27
|
-
Version string `yaml:"version"`
|
26
|
+
Name string `yaml:"name"`
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
// bosh_cli uses fingerprint as job version
|
29
|
+
VersionRaw string `yaml:"version"`
|
30
|
+
Version string
|
31
31
|
|
32
|
-
|
32
|
+
FingerprintRaw string `yaml:"fingerprint"`
|
33
|
+
Fingerprint string
|
34
|
+
|
35
|
+
SHA1Raw string `yaml:"sha1"`
|
36
|
+
SHA1 string
|
33
37
|
}
|
34
38
|
|
35
39
|
type Package struct {
|
36
|
-
Name
|
37
|
-
|
40
|
+
Name string `yaml:"name"`
|
41
|
+
|
42
|
+
// bosh_cli uses fingerprint as package version
|
43
|
+
VersionRaw string `yaml:"version"`
|
44
|
+
Version string
|
38
45
|
|
39
|
-
|
40
|
-
|
46
|
+
FingerprintRaw string `yaml:"fingerprint"`
|
47
|
+
Fingerprint string
|
48
|
+
|
49
|
+
SHA1Raw string `yaml:"sha1"`
|
50
|
+
SHA1 string
|
41
51
|
|
42
52
|
DependencyNames []DependencyName `yaml:"dependencies"`
|
43
53
|
}
|
@@ -48,20 +58,34 @@ func (p Package) DependencyName() DependencyName {
|
|
48
58
|
|
49
59
|
type DependencyName string
|
50
60
|
|
61
|
+
// NewManifestFromPath returns manifest read from the file system.
|
51
62
|
func NewManifestFromPath(path string, fs boshsys.FileSystem) (Manifest, error) {
|
52
63
|
bytes, err := fs.ReadFile(path)
|
53
64
|
if err != nil {
|
54
65
|
return Manifest{}, bosherr.WrapError(err, "Reading manifest %s", path)
|
55
66
|
}
|
56
67
|
|
68
|
+
return NewManifestFromBytes(bytes)
|
69
|
+
}
|
70
|
+
|
71
|
+
// NewManifestFromBytes returns manifest built from given bytes.
|
72
|
+
func NewManifestFromBytes(bytes []byte) (Manifest, error) {
|
73
|
+
var manifest Manifest
|
57
74
|
var release Release
|
58
75
|
|
59
|
-
err
|
76
|
+
err := candiedyaml.Unmarshal(bytes, &release)
|
77
|
+
if err != nil {
|
78
|
+
return manifest, bosherr.WrapError(err, "Parsing release")
|
79
|
+
}
|
80
|
+
|
81
|
+
manifest.Release = release
|
82
|
+
|
83
|
+
err = NewSyntaxValidator(&manifest).Validate()
|
60
84
|
if err != nil {
|
61
|
-
return
|
85
|
+
return manifest, bosherr.WrapError(err, "Validating manifest syntactically")
|
62
86
|
}
|
63
87
|
|
64
|
-
return
|
88
|
+
return manifest, nil
|
65
89
|
}
|
66
90
|
|
67
91
|
/*
|
@@ -76,10 +100,10 @@ packages:
|
|
76
100
|
- name: registry
|
77
101
|
version: !binary |-
|
78
102
|
ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==
|
79
|
-
sha1: !binary |-
|
80
|
-
NmVhYTZjOTYxZWFjN2JkOTk0ZDE2NDRhZDQwNWIzMzk1NDIwZWNhZg==
|
81
103
|
fingerprint: !binary |-
|
82
104
|
ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==
|
105
|
+
sha1: !binary |-
|
106
|
+
NmVhYTZjOTYxZWFjN2JkOTk0ZDE2NDRhZDQwNWIzMzk1NDIwZWNhZg==
|
83
107
|
dependencies:
|
84
108
|
- libpq
|
85
109
|
- mysql
|
@@ -0,0 +1,72 @@
|
|
1
|
+
package manifest_test
|
2
|
+
|
3
|
+
import (
|
4
|
+
. "github.com/onsi/ginkgo"
|
5
|
+
. "github.com/onsi/gomega"
|
6
|
+
|
7
|
+
. "boshprovisioner/release/manifest"
|
8
|
+
)
|
9
|
+
|
10
|
+
var _ = Describe("Manifest", func() {
|
11
|
+
Describe("NewManifestFromBytes", func() {
|
12
|
+
It("returns manifest with decoded version/fingerprint/sha1 for jobs and packages", func() {
|
13
|
+
manifestBytes := []byte(`
|
14
|
+
name: bosh
|
15
|
+
version: 77
|
16
|
+
|
17
|
+
commit_hash: bbe5476c
|
18
|
+
uncommitted_changes: true
|
19
|
+
|
20
|
+
packages:
|
21
|
+
- name: registry
|
22
|
+
version: !binary |-
|
23
|
+
ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==
|
24
|
+
fingerprint: !binary |-
|
25
|
+
ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==
|
26
|
+
sha1: !binary |-
|
27
|
+
NmVhYTZjOTYxZWFjN2JkOTk0ZDE2NDRhZDQwNWIzMzk1NDIwZWNhZg==
|
28
|
+
dependencies: []
|
29
|
+
|
30
|
+
jobs:
|
31
|
+
- name: powerdns
|
32
|
+
version: !binary |-
|
33
|
+
MGI4MGIzYzE5OGJmN2FiYzZjODEyNjIwMTNkZTQ5NDM2OWZkMjViNg==
|
34
|
+
fingerprint: !binary |-
|
35
|
+
MGI4MGIzYzE5OGJmN2FiYzZjODEyNjIwMTNkZTQ5NDM2OWZkMjViNg==
|
36
|
+
sha1: !binary |-
|
37
|
+
YWI5NzA5YmVhYjViZTBmYjYyYTJkMWYzYzg4ZDA2YzliNGJkZWM2NQ==
|
38
|
+
`)
|
39
|
+
|
40
|
+
manifest, err := NewManifestFromBytes(manifestBytes)
|
41
|
+
Expect(err).ToNot(HaveOccurred())
|
42
|
+
|
43
|
+
Expect(manifest.Release.Packages[0]).To(Equal(Package{
|
44
|
+
Name: "registry",
|
45
|
+
|
46
|
+
VersionRaw: "ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==",
|
47
|
+
Version: "dd1ba330bc44b3181b263383b8e4252d7051deca",
|
48
|
+
|
49
|
+
FingerprintRaw: "ZGQxYmEzMzBiYzQ0YjMxODFiMjYzMzgzYjhlNDI1MmQ3MDUxZGVjYQ==",
|
50
|
+
Fingerprint: "dd1ba330bc44b3181b263383b8e4252d7051deca",
|
51
|
+
|
52
|
+
SHA1Raw: "NmVhYTZjOTYxZWFjN2JkOTk0ZDE2NDRhZDQwNWIzMzk1NDIwZWNhZg==",
|
53
|
+
SHA1: "6eaa6c961eac7bd994d1644ad405b3395420ecaf",
|
54
|
+
|
55
|
+
DependencyNames: []DependencyName{},
|
56
|
+
}))
|
57
|
+
|
58
|
+
Expect(manifest.Release.Jobs[0]).To(Equal(Job{
|
59
|
+
Name: "powerdns",
|
60
|
+
|
61
|
+
VersionRaw: "MGI4MGIzYzE5OGJmN2FiYzZjODEyNjIwMTNkZTQ5NDM2OWZkMjViNg==",
|
62
|
+
Version: "0b80b3c198bf7abc6c81262013de494369fd25b6",
|
63
|
+
|
64
|
+
FingerprintRaw: "MGI4MGIzYzE5OGJmN2FiYzZjODEyNjIwMTNkZTQ5NDM2OWZkMjViNg==",
|
65
|
+
Fingerprint: "0b80b3c198bf7abc6c81262013de494369fd25b6",
|
66
|
+
|
67
|
+
SHA1Raw: "YWI5NzA5YmVhYjViZTBmYjYyYTJkMWYzYzg4ZDA2YzliNGJkZWM2NQ==",
|
68
|
+
SHA1: "ab9709beab5be0fb62a2d1f3c88d06c9b4bdec65",
|
69
|
+
}))
|
70
|
+
})
|
71
|
+
})
|
72
|
+
})
|
@@ -0,0 +1,134 @@
|
|
1
|
+
package manifest
|
2
|
+
|
3
|
+
import (
|
4
|
+
"encoding/base64"
|
5
|
+
|
6
|
+
bosherr "bosh/errors"
|
7
|
+
)
|
8
|
+
|
9
|
+
// SyntaxValidator parses and saves all manifest values to determine
|
10
|
+
// their syntactic validity. Determining if individual values make sense
|
11
|
+
// in a greater context (within a full release) is outside of scope.
|
12
|
+
type SyntaxValidator struct {
|
13
|
+
release *Release
|
14
|
+
}
|
15
|
+
|
16
|
+
func NewSyntaxValidator(manifest *Manifest) SyntaxValidator {
|
17
|
+
if manifest == nil {
|
18
|
+
panic("Expected manifest to not be nil")
|
19
|
+
}
|
20
|
+
|
21
|
+
return SyntaxValidator{release: &manifest.Release}
|
22
|
+
}
|
23
|
+
|
24
|
+
func (v SyntaxValidator) Validate() error {
|
25
|
+
if v.release.Name == "" {
|
26
|
+
return bosherr.New("Missing release name")
|
27
|
+
}
|
28
|
+
|
29
|
+
if v.release.Version == "" {
|
30
|
+
return bosherr.New("Missing release version")
|
31
|
+
}
|
32
|
+
|
33
|
+
if v.release.CommitHash == "" {
|
34
|
+
return bosherr.New("Missing release commit_hash")
|
35
|
+
}
|
36
|
+
|
37
|
+
for i, job := range v.release.Jobs {
|
38
|
+
err := v.validateJob(&v.release.Jobs[i])
|
39
|
+
if err != nil {
|
40
|
+
return bosherr.WrapError(err, "Job %s (%d)", job.Name, i)
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
for i, pkg := range v.release.Packages {
|
45
|
+
err := v.validatePkg(&v.release.Packages[i])
|
46
|
+
if err != nil {
|
47
|
+
return bosherr.WrapError(err, "Package %s (%d)", pkg.Name, i)
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
return nil
|
52
|
+
}
|
53
|
+
|
54
|
+
func (v SyntaxValidator) validateJob(job *Job) error {
|
55
|
+
if job.Name == "" {
|
56
|
+
return bosherr.New("Missing name")
|
57
|
+
}
|
58
|
+
|
59
|
+
if job.VersionRaw == "" {
|
60
|
+
return bosherr.New("Missing version")
|
61
|
+
}
|
62
|
+
|
63
|
+
bytes, err := base64.StdEncoding.DecodeString(job.VersionRaw)
|
64
|
+
if err != nil {
|
65
|
+
return bosherr.WrapError(err, "Decoding base64 encoded version")
|
66
|
+
}
|
67
|
+
|
68
|
+
job.Version = string(bytes)
|
69
|
+
|
70
|
+
if job.FingerprintRaw == "" {
|
71
|
+
return bosherr.New("Missing fingerprint")
|
72
|
+
}
|
73
|
+
|
74
|
+
bytes, err = base64.StdEncoding.DecodeString(job.FingerprintRaw)
|
75
|
+
if err != nil {
|
76
|
+
return bosherr.WrapError(err, "Decoding base64 encoded fingerprint")
|
77
|
+
}
|
78
|
+
|
79
|
+
job.Fingerprint = string(bytes)
|
80
|
+
|
81
|
+
if job.SHA1Raw == "" {
|
82
|
+
return bosherr.New("Missing sha1")
|
83
|
+
}
|
84
|
+
|
85
|
+
bytes, err = base64.StdEncoding.DecodeString(job.SHA1Raw)
|
86
|
+
if err != nil {
|
87
|
+
return bosherr.WrapError(err, "Decoding base64 encoded sha1")
|
88
|
+
}
|
89
|
+
|
90
|
+
job.SHA1 = string(bytes)
|
91
|
+
|
92
|
+
return nil
|
93
|
+
}
|
94
|
+
|
95
|
+
func (v SyntaxValidator) validatePkg(pkg *Package) error {
|
96
|
+
if pkg.Name == "" {
|
97
|
+
return bosherr.New("Missing name")
|
98
|
+
}
|
99
|
+
|
100
|
+
if pkg.VersionRaw == "" {
|
101
|
+
return bosherr.New("Missing version")
|
102
|
+
}
|
103
|
+
|
104
|
+
bytes, err := base64.StdEncoding.DecodeString(pkg.VersionRaw)
|
105
|
+
if err != nil {
|
106
|
+
return bosherr.WrapError(err, "Decoding base64 encoded version")
|
107
|
+
}
|
108
|
+
|
109
|
+
pkg.Version = string(bytes)
|
110
|
+
|
111
|
+
if pkg.FingerprintRaw == "" {
|
112
|
+
return bosherr.New("Missing fingerprint")
|
113
|
+
}
|
114
|
+
|
115
|
+
bytes, err = base64.StdEncoding.DecodeString(pkg.FingerprintRaw)
|
116
|
+
if err != nil {
|
117
|
+
return bosherr.WrapError(err, "Decoding base64 encoded fingerprint")
|
118
|
+
}
|
119
|
+
|
120
|
+
pkg.Fingerprint = string(bytes)
|
121
|
+
|
122
|
+
if pkg.SHA1Raw == "" {
|
123
|
+
return bosherr.New("Missing sha1")
|
124
|
+
}
|
125
|
+
|
126
|
+
bytes, err = base64.StdEncoding.DecodeString(pkg.SHA1Raw)
|
127
|
+
if err != nil {
|
128
|
+
return bosherr.WrapError(err, "Decoding base64 encoded sha1")
|
129
|
+
}
|
130
|
+
|
131
|
+
pkg.SHA1 = string(bytes)
|
132
|
+
|
133
|
+
return nil
|
134
|
+
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
package release
|
2
2
|
|
3
3
|
import (
|
4
|
+
"strings"
|
5
|
+
|
4
6
|
boshlog "bosh/logger"
|
5
7
|
boshsys "bosh/system"
|
6
8
|
|
@@ -8,6 +10,10 @@ import (
|
|
8
10
|
bptar "boshprovisioner/tar"
|
9
11
|
)
|
10
12
|
|
13
|
+
const (
|
14
|
+
readerFactoryDirPrefix = "dir://"
|
15
|
+
)
|
16
|
+
|
11
17
|
type ReaderFactory struct {
|
12
18
|
downloader bpdload.Downloader
|
13
19
|
extractor bptar.Extractor
|
@@ -29,6 +35,11 @@ func NewReaderFactory(
|
|
29
35
|
}
|
30
36
|
}
|
31
37
|
|
32
|
-
func (rf ReaderFactory)
|
33
|
-
|
38
|
+
func (rf ReaderFactory) NewReader(name, version, url string) Reader {
|
39
|
+
if strings.HasPrefix(url, readerFactoryDirPrefix) {
|
40
|
+
path := url[len(readerFactoryDirPrefix):]
|
41
|
+
return NewDirReader(name, version, path, rf.fs, rf.logger)
|
42
|
+
}
|
43
|
+
|
44
|
+
return NewTarReader(url, rf.downloader, rf.extractor, rf.fs, rf.logger)
|
34
45
|
}
|