vagrant-bosh 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.gitmodules +6 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +73 -0
- data/Rakefile +2 -0
- data/dev/.gitignore +1 -0
- data/dev/Vagrantfile +30 -0
- data/dev/example-bosh-manifest.yml +188 -0
- data/dev/example-winston-manifest.yml +70 -0
- data/go/.gitignore +11 -0
- data/go/bin/build +10 -0
- data/go/bin/build-linux-amd64 +9 -0
- data/go/bin/env +13 -0
- data/go/bin/go +5 -0
- data/go/bin/golint +19 -0
- data/go/bin/test +37 -0
- data/go/src/boshprovisioner/agent/client/client_interface.go +73 -0
- data/go/src/boshprovisioner/agent/client/fakes/fake_client.go +81 -0
- data/go/src/boshprovisioner/agent/client/http_client.go +299 -0
- data/go/src/boshprovisioner/agent/client/http_client_envelope.go +107 -0
- data/go/src/boshprovisioner/deployment/deployment.go +221 -0
- data/go/src/boshprovisioner/deployment/instance.go +54 -0
- data/go/src/boshprovisioner/deployment/manifest/deployment.go +80 -0
- data/go/src/boshprovisioner/deployment/manifest/ips.go +23 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest.go +143 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/deployment/manifest/manifest_test.go +86 -0
- data/go/src/boshprovisioner/deployment/manifest/syntax_validator.go +186 -0
- data/go/src/boshprovisioner/deployment/manifest/watch_time.go +47 -0
- data/go/src/boshprovisioner/deployment/manifest_reader.go +46 -0
- data/go/src/boshprovisioner/deployment/reader_factory.go +25 -0
- data/go/src/boshprovisioner/deployment/semantic_validator.go +111 -0
- data/go/src/boshprovisioner/downloader/blobstore_downloader.go +55 -0
- data/go/src/boshprovisioner/downloader/default_mux_downloader.go +22 -0
- data/go/src/boshprovisioner/downloader/downloader_interface.go +6 -0
- data/go/src/boshprovisioner/downloader/http_downloader.go +53 -0
- data/go/src/boshprovisioner/downloader/local_fs_downloader.go +48 -0
- data/go/src/boshprovisioner/downloader/mux_downloader.go +69 -0
- data/go/src/boshprovisioner/eventlog/log.go +72 -0
- data/go/src/boshprovisioner/eventlog/stage.go +39 -0
- data/go/src/boshprovisioner/eventlog/task.go +58 -0
- data/go/src/boshprovisioner/index/file_index.go +289 -0
- data/go/src/boshprovisioner/index/file_index_test.go +296 -0
- data/go/src/boshprovisioner/index/index_interface.go +18 -0
- data/go/src/boshprovisioner/index/index_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/concrete_templates_compiler.go +273 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erb_renderer.go +117 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/erbrenderer_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties.go +77 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/render_properties_test.go +142 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context.go +85 -0
- data/go/src/boshprovisioner/instance/templatescompiler/erbrenderer/template_evaluation_context_rb.go +155 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_jobs_repository.go +64 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_runtime_packages_repository.go +105 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/concrete_template_to_job_repository.go +76 -0
- data/go/src/boshprovisioner/instance/templatescompiler/jobsrepo/jobs_repository_interface.go +31 -0
- data/go/src/boshprovisioner/instance/templatescompiler/rendered_archives_compiler.go +81 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templates_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/ct_repository.go +54 -0
- data/go/src/boshprovisioner/instance/templatescompiler/templatesrepo/templates_repository_interface.go +16 -0
- data/go/src/boshprovisioner/instance/updater/applier/applier.go +93 -0
- data/go/src/boshprovisioner/instance/updater/applier/empty_state.go +66 -0
- data/go/src/boshprovisioner/instance/updater/applier/job_state.go +178 -0
- data/go/src/boshprovisioner/instance/updater/drainer.go +72 -0
- data/go/src/boshprovisioner/instance/updater/preparer.go +39 -0
- data/go/src/boshprovisioner/instance/updater/starter.go +36 -0
- data/go/src/boshprovisioner/instance/updater/stopper.go +36 -0
- data/go/src/boshprovisioner/instance/updater/updater.go +102 -0
- data/go/src/boshprovisioner/instance/updater/updater_factory.go +83 -0
- data/go/src/boshprovisioner/instance/updater/updater_suite_test.go +13 -0
- data/go/src/boshprovisioner/instance/updater/waiter.go +77 -0
- data/go/src/boshprovisioner/instance/updater/waiter_test.go +103 -0
- data/go/src/boshprovisioner/main/config.go +77 -0
- data/go/src/boshprovisioner/main/main.go +183 -0
- data/go/src/boshprovisioner/main/repos_factory.go +96 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/compiled_packages_repository_interface.go +17 -0
- data/go/src/boshprovisioner/packagescompiler/compiledpackagesrepo/concrete_compiled_packages_repository.go +61 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler.go +179 -0
- data/go/src/boshprovisioner/packagescompiler/concrete_packages_compiler_factory.go +48 -0
- data/go/src/boshprovisioner/packagescompiler/packages_compiler_interface.go +20 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/concrete_packages_repository.go +65 -0
- data/go/src/boshprovisioner/packagescompiler/packagesrepo/packages_repository_interface.go +16 -0
- data/go/src/boshprovisioner/provisioner/blobstore_config.go +65 -0
- data/go/src/boshprovisioner/provisioner/blobstore_provisioner.go +38 -0
- data/go/src/boshprovisioner/provisioner/deployment_provisioner.go +97 -0
- data/go/src/boshprovisioner/provisioner/instance_provisioner.go +48 -0
- data/go/src/boshprovisioner/provisioner/release_compiler.go +133 -0
- data/go/src/boshprovisioner/release/job/job.go +86 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest.go +79 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/job/manifest/manifest_test.go +42 -0
- data/go/src/boshprovisioner/release/job/manifest/syntax_validator.go +43 -0
- data/go/src/boshprovisioner/release/job/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/job/tar_reader.go +133 -0
- data/go/src/boshprovisioner/release/manifest/manifest.go +96 -0
- data/go/src/boshprovisioner/release/manifest_reader.go +29 -0
- data/go/src/boshprovisioner/release/reader_factory.go +34 -0
- data/go/src/boshprovisioner/release/release.go +144 -0
- data/go/src/boshprovisioner/release/release_suite_test.go +13 -0
- data/go/src/boshprovisioner/release/release_test.go +129 -0
- data/go/src/boshprovisioner/release/tar_reader.go +139 -0
- data/go/src/boshprovisioner/releasesrepo/blobstore_releases_repository.go +114 -0
- data/go/src/boshprovisioner/releasesrepo/releases_repository_interface.go +15 -0
- data/go/src/boshprovisioner/tar/cmd_compressor.go +68 -0
- data/go/src/boshprovisioner/tar/cmd_extractor.go +47 -0
- data/go/src/boshprovisioner/tar/compressor_interface.go +6 -0
- data/go/src/boshprovisioner/tar/extractor_interface.go +6 -0
- data/go/src/boshprovisioner/util/string_keyed.go +70 -0
- data/go/src/boshprovisioner/vm/agent_provisioner.go +266 -0
- data/go/src/boshprovisioner/vm/asset_manager.go +61 -0
- data/go/src/boshprovisioner/vm/deps_provisioner.go +92 -0
- data/go/src/boshprovisioner/vm/monit_provisioner.go +83 -0
- data/go/src/boshprovisioner/vm/runit_provisioner.go +225 -0
- data/go/src/boshprovisioner/vm/simple_cmds.go +54 -0
- data/go/src/boshprovisioner/vm/vcap_user_provisioner.go +120 -0
- data/go/src/boshprovisioner/vm/vm.go +19 -0
- data/go/src/boshprovisioner/vm/vm_provisioner.go +57 -0
- data/go/src/boshprovisioner/vm/vm_provisioner_factory.go +97 -0
- data/lib/vagrant-bosh/asset_uploader.rb +53 -0
- data/lib/vagrant-bosh/assets/agent/agent-log +5 -0
- data/lib/vagrant-bosh/assets/agent/agent-run +12 -0
- data/lib/vagrant-bosh/assets/agent/agent.cert +18 -0
- data/lib/vagrant-bosh/assets/agent/agent.json +9 -0
- data/lib/vagrant-bosh/assets/agent/agent.key +27 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent +0 -0
- data/lib/vagrant-bosh/assets/agent/bosh-agent-rc +18 -0
- data/lib/vagrant-bosh/assets/agent/bosh-blobstore-dav +0 -0
- data/lib/vagrant-bosh/assets/monit/monit +0 -0
- data/lib/vagrant-bosh/assets/monit/monit-log +5 -0
- data/lib/vagrant-bosh/assets/monit/monit-run +9 -0
- data/lib/vagrant-bosh/assets/monit/monitrc +8 -0
- data/lib/vagrant-bosh/assets/provisioner +0 -0
- data/lib/vagrant-bosh/bootstrapper.rb +59 -0
- data/lib/vagrant-bosh/communicator.rb +50 -0
- data/lib/vagrant-bosh/config.rb +15 -0
- data/lib/vagrant-bosh/errors.rb +11 -0
- data/lib/vagrant-bosh/plugin.rb +25 -0
- data/lib/vagrant-bosh/provisioner.rb +46 -0
- data/lib/vagrant-bosh/provisioner_tracker.rb +41 -0
- data/lib/vagrant-bosh/ui.rb +77 -0
- data/lib/vagrant-bosh/version.rb +5 -0
- data/lib/vagrant-bosh.rb +15 -0
- data/templates/locales/en.yml +15 -0
- data/vagrant-bosh.gemspec +20 -0
- metadata +191 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
package applier
|
2
|
+
|
3
|
+
import (
|
4
|
+
boshas "bosh/agent/applier/applyspec"
|
5
|
+
|
6
|
+
bpdep "boshprovisioner/deployment"
|
7
|
+
)
|
8
|
+
|
9
|
+
// EmptyState represents state for a VM
|
10
|
+
// that should not be running any job templates.
|
11
|
+
type EmptyState struct {
|
12
|
+
instance bpdep.Instance
|
13
|
+
}
|
14
|
+
|
15
|
+
func NewEmptyState(instance bpdep.Instance) EmptyState {
|
16
|
+
return EmptyState{instance: instance}
|
17
|
+
}
|
18
|
+
|
19
|
+
func (s EmptyState) AsApplySpec() boshas.V1ApplySpec {
|
20
|
+
var spec boshas.V1ApplySpec
|
21
|
+
|
22
|
+
jobName := s.instance.JobName
|
23
|
+
jobIndex := s.instance.Index
|
24
|
+
|
25
|
+
spec = boshas.V1ApplySpec{
|
26
|
+
ConfigurationHash: "fake-configuration-hash", // todo
|
27
|
+
|
28
|
+
Deployment: s.instance.DeploymentName,
|
29
|
+
|
30
|
+
JobSpec: boshas.JobSpec{
|
31
|
+
Name: &jobName,
|
32
|
+
},
|
33
|
+
|
34
|
+
Index: &jobIndex,
|
35
|
+
|
36
|
+
NetworkSpecs: s.buildNetworkSpecs(),
|
37
|
+
|
38
|
+
// todo find out whats here
|
39
|
+
ResourcePoolSpecs: s.buildResourcePoolSpecs(),
|
40
|
+
}
|
41
|
+
|
42
|
+
return spec
|
43
|
+
}
|
44
|
+
|
45
|
+
func (s EmptyState) buildNetworkSpecs() map[string]boshas.NetworkSpec {
|
46
|
+
specs := map[string]boshas.NetworkSpec{}
|
47
|
+
|
48
|
+
for _, netAssoc := range s.instance.NetworkAssociations {
|
49
|
+
netConfig := s.instance.NetworkConfigurationForNetworkAssociation(netAssoc)
|
50
|
+
|
51
|
+
specs[netAssoc.Network.Name] = boshas.NetworkSpec{
|
52
|
+
Fields: map[string]interface{}{
|
53
|
+
"type": netAssoc.Network.Type,
|
54
|
+
"ip": netConfig.IP,
|
55
|
+
"netmask": netConfig.Netmask,
|
56
|
+
"gateway": netConfig.Gateway,
|
57
|
+
},
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
return specs
|
62
|
+
}
|
63
|
+
|
64
|
+
func (s EmptyState) buildResourcePoolSpecs() map[string]interface{} {
|
65
|
+
return map[string]interface{}{}
|
66
|
+
}
|
@@ -0,0 +1,178 @@
|
|
1
|
+
package applier
|
2
|
+
|
3
|
+
import (
|
4
|
+
boshas "bosh/agent/applier/applyspec"
|
5
|
+
bosherr "bosh/errors"
|
6
|
+
|
7
|
+
bpdep "boshprovisioner/deployment"
|
8
|
+
bptplcomp "boshprovisioner/instance/templatescompiler"
|
9
|
+
bppkgscomp "boshprovisioner/packagescompiler"
|
10
|
+
)
|
11
|
+
|
12
|
+
// JobState represents state for a VM
|
13
|
+
// that should be running 1+ job templates.
|
14
|
+
type JobState struct {
|
15
|
+
depJob bpdep.Job
|
16
|
+
instance bpdep.Instance
|
17
|
+
|
18
|
+
templatesCompiler bptplcomp.TemplatesCompiler
|
19
|
+
packagesCompiler bppkgscomp.PackagesCompiler
|
20
|
+
|
21
|
+
emptyState EmptyState
|
22
|
+
}
|
23
|
+
|
24
|
+
func NewJobState(
|
25
|
+
depJob bpdep.Job,
|
26
|
+
instance bpdep.Instance,
|
27
|
+
templatesCompiler bptplcomp.TemplatesCompiler,
|
28
|
+
packagesCompiler bppkgscomp.PackagesCompiler,
|
29
|
+
) JobState {
|
30
|
+
return JobState{
|
31
|
+
depJob: depJob,
|
32
|
+
instance: instance,
|
33
|
+
|
34
|
+
templatesCompiler: templatesCompiler,
|
35
|
+
packagesCompiler: packagesCompiler,
|
36
|
+
|
37
|
+
emptyState: NewEmptyState(instance),
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
func (s JobState) AsApplySpec() (boshas.V1ApplySpec, error) {
|
42
|
+
var err error
|
43
|
+
|
44
|
+
spec := s.emptyState.AsApplySpec()
|
45
|
+
|
46
|
+
// JobTemplateSpecs list templates names; however,
|
47
|
+
// actual template content would come from RenderedTemplatesArchiveSpec
|
48
|
+
spec.JobSpec.JobTemplateSpecs = s.buildJobTemplateSpecs()
|
49
|
+
|
50
|
+
// Package dependencies for all job templates
|
51
|
+
spec.PackageSpecs, err = s.buildPackageSpecs()
|
52
|
+
if err != nil {
|
53
|
+
return spec, err
|
54
|
+
}
|
55
|
+
|
56
|
+
// Provides content for JobTemplateSpecs
|
57
|
+
spec.RenderedTemplatesArchiveSpec, err = s.buildRenderedTemplatesArchive()
|
58
|
+
if err != nil {
|
59
|
+
return spec, err
|
60
|
+
}
|
61
|
+
|
62
|
+
return spec, nil
|
63
|
+
}
|
64
|
+
|
65
|
+
func (s JobState) buildJobTemplateSpecs() []boshas.JobTemplateSpec {
|
66
|
+
var specs []boshas.JobTemplateSpec
|
67
|
+
|
68
|
+
for _, template := range s.depJob.Templates {
|
69
|
+
spec := boshas.JobTemplateSpec{
|
70
|
+
Name: template.Name,
|
71
|
+
Version: "fake-job-template-version", // todo
|
72
|
+
|
73
|
+
Sha1: "", // deprecated
|
74
|
+
BlobstoreID: "", // deprecated
|
75
|
+
}
|
76
|
+
|
77
|
+
specs = append(specs, spec)
|
78
|
+
}
|
79
|
+
|
80
|
+
return specs
|
81
|
+
}
|
82
|
+
|
83
|
+
func (s JobState) buildPackageSpecs() (map[string]boshas.PackageSpec, error) {
|
84
|
+
specs := map[string]boshas.PackageSpec{}
|
85
|
+
|
86
|
+
for _, template := range s.depJob.Templates {
|
87
|
+
pkgs, err := s.templatesCompiler.FindPackages(template)
|
88
|
+
if err != nil {
|
89
|
+
return specs, bosherr.WrapError(err, "Finding packages for template %s", template.Name)
|
90
|
+
}
|
91
|
+
|
92
|
+
for _, pkg := range pkgs {
|
93
|
+
rec, err := s.packagesCompiler.FindCompiledPackage(pkg)
|
94
|
+
if err != nil {
|
95
|
+
return specs, bosherr.WrapError(err, "Finding compiled package %s", pkg.Name)
|
96
|
+
}
|
97
|
+
|
98
|
+
specs[pkg.Name] = boshas.PackageSpec{
|
99
|
+
Name: pkg.Name,
|
100
|
+
Version: pkg.Version,
|
101
|
+
|
102
|
+
Sha1: rec.SHA1,
|
103
|
+
BlobstoreID: rec.BlobID,
|
104
|
+
}
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
return specs, nil
|
109
|
+
}
|
110
|
+
|
111
|
+
func (s JobState) buildRenderedTemplatesArchive() (boshas.RenderedTemplatesArchiveSpec, error) {
|
112
|
+
var archive boshas.RenderedTemplatesArchiveSpec
|
113
|
+
|
114
|
+
rec, err := s.templatesCompiler.FindRenderedArchive(s.depJob, s.instance)
|
115
|
+
if err != nil {
|
116
|
+
return archive, bosherr.WrapError(
|
117
|
+
err, "Finding rendered archive %s", s.depJob.Name)
|
118
|
+
}
|
119
|
+
|
120
|
+
// todo uppercase Sha1
|
121
|
+
archive.Sha1 = rec.SHA1
|
122
|
+
archive.BlobstoreID = rec.BlobID
|
123
|
+
|
124
|
+
return archive, nil
|
125
|
+
}
|
126
|
+
|
127
|
+
/*
|
128
|
+
// Example apply spec
|
129
|
+
{
|
130
|
+
"job": {
|
131
|
+
"name": "router",
|
132
|
+
"template": "router template",
|
133
|
+
"version": "1.0",
|
134
|
+
"sha1": "router sha1",
|
135
|
+
"blobstore_id": "router-blob-id-1",
|
136
|
+
"templates": [{
|
137
|
+
"name": "template 1",
|
138
|
+
"version": "0.1",
|
139
|
+
"sha1": "template 1 sha1",
|
140
|
+
"blobstore_id": "template-blob-id-1"
|
141
|
+
}]
|
142
|
+
},
|
143
|
+
|
144
|
+
"index": 1,
|
145
|
+
|
146
|
+
"packages": {
|
147
|
+
"package 1": {
|
148
|
+
"name": "package 1",
|
149
|
+
"version": "0.1",
|
150
|
+
"sha1": "package 1 sha1",
|
151
|
+
"blobstore_id": "package-blob-id-1"
|
152
|
+
}
|
153
|
+
},
|
154
|
+
|
155
|
+
"networks": {
|
156
|
+
"manual-net": {
|
157
|
+
"ip": "xx.xx.xx.xx",
|
158
|
+
"gateway": "xx.xx.xx.xx",
|
159
|
+
"netmask": "xx.xx.xx.xx",
|
160
|
+
"dns": ["xx.xx.xx.xx"],
|
161
|
+
"default": ["dns", "gateway"],
|
162
|
+
"cloud_properties": {"subnet": "subnet-xxxxxx"},
|
163
|
+
"dns_record_name": "job-index.job-name.manual-net.deployment-name.bosh"
|
164
|
+
},
|
165
|
+
"vip-net": {
|
166
|
+
"type": "vip",
|
167
|
+
"ip": "xx.xx.xx.xx",
|
168
|
+
"cloud_properties": {"security_groups": ["bosh"]},
|
169
|
+
"dns_record_name": "job-index.job-name.vip-net.deployment-name.bosh"
|
170
|
+
}
|
171
|
+
},
|
172
|
+
|
173
|
+
"rendered_templates_archive": {
|
174
|
+
"sha1": "archive sha 1",
|
175
|
+
"blobstore_id": "archive-blob-id-1"
|
176
|
+
}
|
177
|
+
}
|
178
|
+
*/
|
@@ -0,0 +1,72 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
"math"
|
5
|
+
"time"
|
6
|
+
|
7
|
+
boshaction "bosh/agent/action"
|
8
|
+
boshas "bosh/agent/applier/applyspec"
|
9
|
+
bosherr "bosh/errors"
|
10
|
+
boshlog "bosh/logger"
|
11
|
+
|
12
|
+
bpagclient "boshprovisioner/agent/client"
|
13
|
+
)
|
14
|
+
|
15
|
+
const drainerLogTag = "Drainer"
|
16
|
+
|
17
|
+
type Drainer struct {
|
18
|
+
agentClient bpagclient.Client
|
19
|
+
logger boshlog.Logger
|
20
|
+
}
|
21
|
+
|
22
|
+
func NewDrainer(
|
23
|
+
agentClient bpagclient.Client,
|
24
|
+
logger boshlog.Logger,
|
25
|
+
) Drainer {
|
26
|
+
return Drainer{
|
27
|
+
agentClient: agentClient,
|
28
|
+
logger: logger,
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
func (d Drainer) Drain() error {
|
33
|
+
d.logger.Debug(drainerLogTag, "Draining instance")
|
34
|
+
|
35
|
+
drainType := boshaction.DrainTypeUpdate
|
36
|
+
spec := boshas.V1ApplySpec{}
|
37
|
+
|
38
|
+
drainTime, err := d.agentClient.Drain(drainType, spec)
|
39
|
+
if err != nil {
|
40
|
+
return bosherr.WrapError(err, "Sending drain update")
|
41
|
+
}
|
42
|
+
|
43
|
+
if drainTime > 0 {
|
44
|
+
d.logger.Debug(drainerLogTag, "Waiting for static drain to finish")
|
45
|
+
time.Sleep(time.Duration(drainTime) * time.Second)
|
46
|
+
return nil
|
47
|
+
}
|
48
|
+
|
49
|
+
d.logger.Debug(drainerLogTag, "Waiting for dynamic drain to finish")
|
50
|
+
|
51
|
+
return d.waitForDynamicDrain(drainTime)
|
52
|
+
}
|
53
|
+
|
54
|
+
func (d Drainer) waitForDynamicDrain(drainTime int) error {
|
55
|
+
var err error
|
56
|
+
|
57
|
+
for {
|
58
|
+
waitTime := int(math.Abs(float64(drainTime)))
|
59
|
+
if waitTime > 0 {
|
60
|
+
time.Sleep(time.Duration(waitTime) * time.Second)
|
61
|
+
}
|
62
|
+
|
63
|
+
if drainTime >= 0 {
|
64
|
+
return nil
|
65
|
+
}
|
66
|
+
|
67
|
+
drainTime, err = d.agentClient.Drain(boshaction.DrainTypeStatus)
|
68
|
+
if err != nil {
|
69
|
+
return bosherr.WrapError(err, "Sending drain status")
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
boshas "bosh/agent/applier/applyspec"
|
5
|
+
bosherr "bosh/errors"
|
6
|
+
boshlog "bosh/logger"
|
7
|
+
|
8
|
+
bpagclient "boshprovisioner/agent/client"
|
9
|
+
)
|
10
|
+
|
11
|
+
const preparerLogTag = "Preparer"
|
12
|
+
|
13
|
+
type Preparer struct {
|
14
|
+
agentClient bpagclient.Client
|
15
|
+
logger boshlog.Logger
|
16
|
+
}
|
17
|
+
|
18
|
+
func NewPreparer(
|
19
|
+
agentClient bpagclient.Client,
|
20
|
+
logger boshlog.Logger,
|
21
|
+
) Preparer {
|
22
|
+
return Preparer{
|
23
|
+
agentClient: agentClient,
|
24
|
+
logger: logger,
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
func (p Preparer) Prepare() error {
|
29
|
+
p.logger.Debug(preparerLogTag, "Preparing instance")
|
30
|
+
|
31
|
+
spec := boshas.V1ApplySpec{}
|
32
|
+
|
33
|
+
_, err := p.agentClient.Prepare(spec)
|
34
|
+
if err != nil {
|
35
|
+
return bosherr.WrapError(err, "Sending prepare")
|
36
|
+
}
|
37
|
+
|
38
|
+
return nil
|
39
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
bosherr "bosh/errors"
|
5
|
+
boshlog "bosh/logger"
|
6
|
+
|
7
|
+
bpagclient "boshprovisioner/agent/client"
|
8
|
+
)
|
9
|
+
|
10
|
+
const starterLogTag = "Starter"
|
11
|
+
|
12
|
+
type Starter struct {
|
13
|
+
agentClient bpagclient.Client
|
14
|
+
logger boshlog.Logger
|
15
|
+
}
|
16
|
+
|
17
|
+
func NewStarter(
|
18
|
+
agentClient bpagclient.Client,
|
19
|
+
logger boshlog.Logger,
|
20
|
+
) Starter {
|
21
|
+
return Starter{
|
22
|
+
agentClient: agentClient,
|
23
|
+
logger: logger,
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
func (s Starter) Start() error {
|
28
|
+
s.logger.Debug(starterLogTag, "Starting instance")
|
29
|
+
|
30
|
+
_, err := s.agentClient.Start()
|
31
|
+
if err != nil {
|
32
|
+
return bosherr.WrapError(err, "Starting")
|
33
|
+
}
|
34
|
+
|
35
|
+
return nil
|
36
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
bosherr "bosh/errors"
|
5
|
+
boshlog "bosh/logger"
|
6
|
+
|
7
|
+
bpagclient "boshprovisioner/agent/client"
|
8
|
+
)
|
9
|
+
|
10
|
+
const stopperLogTag = "Stopper"
|
11
|
+
|
12
|
+
type Stopper struct {
|
13
|
+
agentClient bpagclient.Client
|
14
|
+
logger boshlog.Logger
|
15
|
+
}
|
16
|
+
|
17
|
+
func NewStopper(
|
18
|
+
agentClient bpagclient.Client,
|
19
|
+
logger boshlog.Logger,
|
20
|
+
) Stopper {
|
21
|
+
return Stopper{
|
22
|
+
agentClient: agentClient,
|
23
|
+
logger: logger,
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
func (s Stopper) Stop() error {
|
28
|
+
s.logger.Debug(stopperLogTag, "Stopping instance")
|
29
|
+
|
30
|
+
_, err := s.agentClient.Stop()
|
31
|
+
if err != nil {
|
32
|
+
return bosherr.WrapError(err, "Stopping")
|
33
|
+
}
|
34
|
+
|
35
|
+
return nil
|
36
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
"fmt"
|
5
|
+
|
6
|
+
bosherr "bosh/errors"
|
7
|
+
boshlog "bosh/logger"
|
8
|
+
|
9
|
+
bpeventlog "boshprovisioner/eventlog"
|
10
|
+
bpapplier "boshprovisioner/instance/updater/applier"
|
11
|
+
)
|
12
|
+
|
13
|
+
const updaterLogTag = "Updater"
|
14
|
+
|
15
|
+
type Updater struct {
|
16
|
+
instanceDesc string
|
17
|
+
|
18
|
+
preparer Preparer
|
19
|
+
drainer Drainer
|
20
|
+
stopper Stopper
|
21
|
+
applier bpapplier.Applier
|
22
|
+
starter Starter
|
23
|
+
waiter Waiter
|
24
|
+
|
25
|
+
eventLog bpeventlog.Log
|
26
|
+
logger boshlog.Logger
|
27
|
+
}
|
28
|
+
|
29
|
+
func NewUpdater(
|
30
|
+
instanceDesc string,
|
31
|
+
preparer Preparer,
|
32
|
+
drainer Drainer,
|
33
|
+
stopper Stopper,
|
34
|
+
applier bpapplier.Applier,
|
35
|
+
starter Starter,
|
36
|
+
waiter Waiter,
|
37
|
+
eventLog bpeventlog.Log,
|
38
|
+
logger boshlog.Logger,
|
39
|
+
) Updater {
|
40
|
+
return Updater{
|
41
|
+
instanceDesc: instanceDesc,
|
42
|
+
|
43
|
+
preparer: preparer,
|
44
|
+
drainer: drainer,
|
45
|
+
stopper: stopper,
|
46
|
+
applier: applier,
|
47
|
+
starter: starter,
|
48
|
+
waiter: waiter,
|
49
|
+
|
50
|
+
eventLog: eventLog,
|
51
|
+
logger: logger,
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
func (u Updater) Update() error {
|
56
|
+
stage := u.eventLog.BeginStage(
|
57
|
+
fmt.Sprintf("Updating instance %s", u.instanceDesc), 6)
|
58
|
+
|
59
|
+
task := stage.BeginTask("Preparing")
|
60
|
+
|
61
|
+
err := task.End(u.preparer.Prepare())
|
62
|
+
if err != nil {
|
63
|
+
return bosherr.WrapError(err, "Preparing")
|
64
|
+
}
|
65
|
+
|
66
|
+
task = stage.BeginTask("Draining")
|
67
|
+
|
68
|
+
err = task.End(u.drainer.Drain())
|
69
|
+
if err != nil {
|
70
|
+
return bosherr.WrapError(err, "Draining")
|
71
|
+
}
|
72
|
+
|
73
|
+
task = stage.BeginTask("Stopping")
|
74
|
+
|
75
|
+
err = task.End(u.stopper.Stop())
|
76
|
+
if err != nil {
|
77
|
+
return bosherr.WrapError(err, "Stopping")
|
78
|
+
}
|
79
|
+
|
80
|
+
task = stage.BeginTask("Applying")
|
81
|
+
|
82
|
+
err = task.End(u.applier.Apply())
|
83
|
+
if err != nil {
|
84
|
+
return bosherr.WrapError(err, "Applying")
|
85
|
+
}
|
86
|
+
|
87
|
+
task = stage.BeginTask("Starting")
|
88
|
+
|
89
|
+
err = task.End(u.starter.Start())
|
90
|
+
if err != nil {
|
91
|
+
return bosherr.WrapError(err, "Starting")
|
92
|
+
}
|
93
|
+
|
94
|
+
task = stage.BeginTask("Waiting")
|
95
|
+
|
96
|
+
err = task.End(u.waiter.Wait())
|
97
|
+
if err != nil {
|
98
|
+
return bosherr.WrapError(err, "Waiting")
|
99
|
+
}
|
100
|
+
|
101
|
+
return nil
|
102
|
+
}
|
@@ -0,0 +1,83 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
"fmt"
|
5
|
+
"time"
|
6
|
+
|
7
|
+
boshlog "bosh/logger"
|
8
|
+
|
9
|
+
bpagclient "boshprovisioner/agent/client"
|
10
|
+
bpdep "boshprovisioner/deployment"
|
11
|
+
bpeventlog "boshprovisioner/eventlog"
|
12
|
+
bptplcomp "boshprovisioner/instance/templatescompiler"
|
13
|
+
bpapplier "boshprovisioner/instance/updater/applier"
|
14
|
+
bppkgscomp "boshprovisioner/packagescompiler"
|
15
|
+
)
|
16
|
+
|
17
|
+
type UpdaterFactory struct {
|
18
|
+
templatesCompiler bptplcomp.TemplatesCompiler
|
19
|
+
packagesCompilerFactory bppkgscomp.ConcretePackagesCompilerFactory
|
20
|
+
|
21
|
+
eventLog bpeventlog.Log
|
22
|
+
logger boshlog.Logger
|
23
|
+
}
|
24
|
+
|
25
|
+
func NewUpdaterFactory(
|
26
|
+
templatesCompiler bptplcomp.TemplatesCompiler,
|
27
|
+
packagesCompilerFactory bppkgscomp.ConcretePackagesCompilerFactory,
|
28
|
+
eventLog bpeventlog.Log,
|
29
|
+
logger boshlog.Logger,
|
30
|
+
) UpdaterFactory {
|
31
|
+
return UpdaterFactory{
|
32
|
+
templatesCompiler: templatesCompiler,
|
33
|
+
packagesCompilerFactory: packagesCompilerFactory,
|
34
|
+
|
35
|
+
eventLog: eventLog,
|
36
|
+
logger: logger,
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
func (f UpdaterFactory) NewUpdater(
|
41
|
+
agentClient bpagclient.Client,
|
42
|
+
depJob bpdep.Job,
|
43
|
+
instance bpdep.Instance,
|
44
|
+
) Updater {
|
45
|
+
preparer := NewPreparer(agentClient, f.logger)
|
46
|
+
|
47
|
+
drainer := NewDrainer(agentClient, f.logger)
|
48
|
+
|
49
|
+
stopper := NewStopper(agentClient, f.logger)
|
50
|
+
|
51
|
+
applier := bpapplier.NewApplier(
|
52
|
+
depJob,
|
53
|
+
instance,
|
54
|
+
f.templatesCompiler,
|
55
|
+
f.packagesCompilerFactory.NewCompiler(agentClient),
|
56
|
+
agentClient,
|
57
|
+
f.logger,
|
58
|
+
)
|
59
|
+
|
60
|
+
starter := NewStarter(agentClient, f.logger)
|
61
|
+
|
62
|
+
waiter := NewWaiter(
|
63
|
+
instance.WatchTime.Start(),
|
64
|
+
instance.WatchTime.End(),
|
65
|
+
time.Sleep,
|
66
|
+
agentClient,
|
67
|
+
f.logger,
|
68
|
+
)
|
69
|
+
|
70
|
+
updater := NewUpdater(
|
71
|
+
fmt.Sprintf("%s/%d", instance.JobName, instance.Index),
|
72
|
+
preparer,
|
73
|
+
drainer,
|
74
|
+
stopper,
|
75
|
+
applier,
|
76
|
+
starter,
|
77
|
+
waiter,
|
78
|
+
f.eventLog,
|
79
|
+
f.logger,
|
80
|
+
)
|
81
|
+
|
82
|
+
return updater
|
83
|
+
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
package updater
|
2
|
+
|
3
|
+
import (
|
4
|
+
"time"
|
5
|
+
|
6
|
+
bosherr "bosh/errors"
|
7
|
+
boshlog "bosh/logger"
|
8
|
+
|
9
|
+
bpagclient "boshprovisioner/agent/client"
|
10
|
+
)
|
11
|
+
|
12
|
+
const waiterLogTag = "Waiter"
|
13
|
+
|
14
|
+
var (
|
15
|
+
ErrNotRunning = bosherr.New("Instance did not reach running state")
|
16
|
+
)
|
17
|
+
|
18
|
+
type Waiter struct {
|
19
|
+
watchSchedule []time.Duration
|
20
|
+
sleepFunc SleepFunc
|
21
|
+
agentClient bpagclient.Client
|
22
|
+
logger boshlog.Logger
|
23
|
+
}
|
24
|
+
|
25
|
+
type SleepFunc func(time.Duration)
|
26
|
+
|
27
|
+
func NewWaiter(
|
28
|
+
startWatchTime int,
|
29
|
+
endWatchTime int,
|
30
|
+
sleepFunc SleepFunc,
|
31
|
+
agentClient bpagclient.Client,
|
32
|
+
logger boshlog.Logger,
|
33
|
+
) Waiter {
|
34
|
+
return Waiter{
|
35
|
+
watchSchedule: buildWatchSchedule(startWatchTime, endWatchTime),
|
36
|
+
sleepFunc: sleepFunc,
|
37
|
+
agentClient: agentClient,
|
38
|
+
logger: logger,
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
// Wait waits for an instance to reach running state.
|
43
|
+
// It polls agent based on a watch schedule and inspects its job state.
|
44
|
+
func (w Waiter) Wait() error {
|
45
|
+
w.logger.Debug(waiterLogTag, "Waiting for instance to reach running state")
|
46
|
+
w.logger.Debug(waiterLogTag, "Using schedule %v", w.watchSchedule)
|
47
|
+
|
48
|
+
for _, timeGap := range w.watchSchedule {
|
49
|
+
w.logger.Debug(waiterLogTag, "Sleeping for %v", timeGap)
|
50
|
+
w.sleepFunc(timeGap)
|
51
|
+
|
52
|
+
state, err := w.agentClient.GetState()
|
53
|
+
if err != nil {
|
54
|
+
return bosherr.WrapError(err, "Sending get_state")
|
55
|
+
}
|
56
|
+
|
57
|
+
// todo stopped state
|
58
|
+
if state.JobState == "running" {
|
59
|
+
return nil
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
return ErrNotRunning
|
64
|
+
}
|
65
|
+
|
66
|
+
// buildWatchSchedule returns list of millisecond interval
|
67
|
+
// at which instance should be checked for its running state.
|
68
|
+
// ([3000, 1000, 1000] =~ wait for 3000ms, then 1000ms, and 1000ms again)
|
69
|
+
func buildWatchSchedule(start, end int) []time.Duration {
|
70
|
+
timeGaps := []time.Duration{time.Duration(start) * time.Millisecond}
|
71
|
+
|
72
|
+
for total := start; total < end; total += 1000 {
|
73
|
+
timeGaps = append(timeGaps, 1000*time.Millisecond)
|
74
|
+
}
|
75
|
+
|
76
|
+
return timeGaps
|
77
|
+
}
|