vagrant-bosh 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. data/README.md +24 -1
  2. data/dev/Vagrantfile +7 -4
  3. data/dev/example-winston-manifest.yml +2 -2
  4. data/docs/build-aws-stemcell.md +66 -0
  5. data/docs/release-url.md +39 -0
  6. data/go/src/boshprovisioner/downloader/local_fs_downloader.go +1 -1
  7. data/go/src/boshprovisioner/main/config.go +28 -13
  8. data/go/src/boshprovisioner/main/config_test.go +67 -0
  9. data/go/src/boshprovisioner/main/main.go +7 -7
  10. data/go/src/boshprovisioner/main/main_suite_test.go +13 -0
  11. data/go/src/boshprovisioner/main/repos_factory.go +0 -10
  12. data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +3 -3
  13. data/go/src/boshprovisioner/provisioner/deployment_provisioner_interface.go +10 -0
  14. data/go/src/boshprovisioner/provisioner/release_compiler.go +11 -51
  15. data/go/src/boshprovisioner/provisioner/{deployment_provisioner.go → single_configured_vm_provisioner.go} +8 -12
  16. data/go/src/boshprovisioner/provisioner/single_non_configured_vm_provisioner.go +40 -0
  17. data/go/src/boshprovisioner/provisioner/single_vm_provisioner_factory.go +68 -0
  18. data/go/src/boshprovisioner/release/dir_reader.go +127 -0
  19. data/go/src/boshprovisioner/release/manifest/manifest.go +38 -14
  20. data/go/src/boshprovisioner/release/manifest/manifest_suite_test.go +13 -0
  21. data/go/src/boshprovisioner/release/manifest/manifest_test.go +72 -0
  22. data/go/src/boshprovisioner/release/manifest/syntax_validator.go +134 -0
  23. data/go/src/boshprovisioner/release/reader_factory.go +13 -2
  24. data/go/src/boshprovisioner/release/reader_interface.go +6 -0
  25. data/go/src/boshprovisioner/release/tar_reader.go +26 -24
  26. data/go/src/boshprovisioner/vm/vagrant/agent_provisioner.go +70 -40
  27. data/go/src/boshprovisioner/vm/vagrant/asset_manager.go +1 -1
  28. data/go/src/boshprovisioner/vm/vagrant/configured_vm.go +29 -0
  29. data/go/src/boshprovisioner/vm/vagrant/deps_provisioner.go +38 -24
  30. data/go/src/boshprovisioner/vm/vagrant/monit_provisioner.go +1 -1
  31. data/go/src/boshprovisioner/vm/vagrant/non_configured_vm.go +26 -0
  32. data/go/src/boshprovisioner/vm/vagrant/runit_provisioner.go +1 -1
  33. data/go/src/boshprovisioner/vm/vagrant/simple_cmds.go +1 -1
  34. data/go/src/boshprovisioner/vm/vagrant/vcap_user_provisioner.go +87 -40
  35. data/go/src/boshprovisioner/vm/vagrant/vm_provisioner.go +58 -20
  36. data/go/src/boshprovisioner/vm/vagrant/vm_provisioner_factory.go +4 -7
  37. data/go/src/boshprovisioner/vm/vm_interface.go +25 -6
  38. data/lib/vagrant-bosh/asset_uploader.rb +4 -3
  39. data/lib/vagrant-bosh/assets/agent/agent-run +4 -1
  40. data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
  41. data/lib/vagrant-bosh/assets/provisioner +0 -0
  42. data/lib/vagrant-bosh/bootstrapper.rb +34 -21
  43. data/lib/vagrant-bosh/communicator.rb +1 -0
  44. data/lib/vagrant-bosh/config.rb +25 -1
  45. data/lib/vagrant-bosh/deployment/manifest.rb +79 -0
  46. data/lib/vagrant-bosh/deployment/manifest_factory.rb +29 -0
  47. data/lib/vagrant-bosh/deployment/release_uploader.rb +40 -0
  48. data/lib/vagrant-bosh/deployment/uploadable_release.rb +82 -0
  49. data/lib/vagrant-bosh/deployment/uploadable_release_factory.rb +28 -0
  50. data/lib/vagrant-bosh/errors.rb +1 -3
  51. data/lib/vagrant-bosh/provisioner.rb +24 -5
  52. data/lib/vagrant-bosh/ui.rb +9 -7
  53. data/lib/vagrant-bosh/version.rb +1 -1
  54. data/templates/locales/en.yml +27 -0
  55. metadata +22 -7
  56. data/go/src/boshprovisioner/release/manifest_reader.go +0 -29
  57. data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +0 -114
  58. data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +0 -15
  59. data/go/src/boshprovisioner/vm/vagrant/vm.go +0 -27
@@ -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 string `yaml:"name"`
27
- Version string `yaml:"version"`
26
+ Name string `yaml:"name"`
28
27
 
29
- Fingerprint string `yaml:"fingerprint"`
30
- SHA1 string `yaml:"sha1"`
28
+ // bosh_cli uses fingerprint as job version
29
+ VersionRaw string `yaml:"version"`
30
+ Version string
31
31
 
32
- DependencyNames []DependencyName `yaml:"dependencies"`
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 string `yaml:"name"`
37
- Version string `yaml:"version"`
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
- Fingerprint string `yaml:"fingerprint"`
40
- SHA1 string `yaml:"sha1"`
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 = candiedyaml.Unmarshal(bytes, &release)
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 Manifest{}, bosherr.WrapError(err, "Parsing release")
85
+ return manifest, bosherr.WrapError(err, "Validating manifest syntactically")
62
86
  }
63
87
 
64
- return Manifest{Release: release}, nil
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,13 @@
1
+ package manifest_test
2
+
3
+ import (
4
+ . "github.com/onsi/ginkgo"
5
+ . "github.com/onsi/gomega"
6
+
7
+ "testing"
8
+ )
9
+
10
+ func TestManifest(t *testing.T) {
11
+ RegisterFailHandler(Fail)
12
+ RunSpecs(t, "Manifest Suite")
13
+ }
@@ -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) NewTarReader(path string) *TarReader {
33
- return NewTarReader(path, rf.downloader, rf.extractor, rf.fs, rf.logger)
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
  }
@@ -0,0 +1,6 @@
1
+ package release
2
+
3
+ type Reader interface {
4
+ Read() (Release, error)
5
+ Close() error
6
+ }