forked from cloudfoundry-attic/bosh-init
-
Notifications
You must be signed in to change notification settings - Fork 0
/
installer.go
96 lines (84 loc) · 2.94 KB
/
installer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package installation
import (
"os"
bosherr "github.com/cloudfoundry/bosh-agent/errors"
boshlog "github.com/cloudfoundry/bosh-agent/logger"
boshsys "github.com/cloudfoundry/bosh-agent/system"
biinstalljob "github.com/cloudfoundry/bosh-init/installation/job"
biinstallmanifest "github.com/cloudfoundry/bosh-init/installation/manifest"
biinstallpkg "github.com/cloudfoundry/bosh-init/installation/pkg"
biinstallstate "github.com/cloudfoundry/bosh-init/installation/state"
biregistry "github.com/cloudfoundry/bosh-init/registry"
biui "github.com/cloudfoundry/bosh-init/ui"
)
type Installer interface {
Install(biinstallmanifest.Manifest, biui.Stage) (Installation, error)
}
type installer struct {
target Target
fs boshsys.FileSystem
stateBuilder biinstallstate.Builder
packagesPath string
packageInstaller biinstallpkg.Installer
jobInstaller biinstalljob.Installer
registryServerManager biregistry.ServerManager
logger boshlog.Logger
logTag string
}
func NewInstaller(
target Target,
fs boshsys.FileSystem,
stateBuilder biinstallstate.Builder,
packagesPath string,
packageInstaller biinstallpkg.Installer,
jobInstaller biinstalljob.Installer,
registryServerManager biregistry.ServerManager,
logger boshlog.Logger,
) Installer {
return &installer{
target: target,
fs: fs,
stateBuilder: stateBuilder,
packagesPath: packagesPath,
packageInstaller: packageInstaller,
jobInstaller: jobInstaller,
registryServerManager: registryServerManager,
logger: logger,
logTag: "installer",
}
}
func (i *installer) Install(manifest biinstallmanifest.Manifest, stage biui.Stage) (Installation, error) {
i.logger.Info(i.logTag, "Installing CPI deployment '%s'", manifest.Name)
i.logger.Debug(i.logTag, "Installing CPI deployment '%s' with manifest: %#v", manifest.Name, manifest)
state, err := i.stateBuilder.Build(manifest, stage)
if err != nil {
return nil, bosherr.WrapError(err, "Building installation state")
}
err = stage.Perform("Installing packages", func() error {
err = i.fs.MkdirAll(i.packagesPath, os.ModePerm)
if err != nil {
return bosherr.WrapErrorf(err, "Creating packages directory '%s'", i.packagesPath)
}
for _, compiledPackageRef := range state.CompiledPackages() {
err = i.packageInstaller.Install(compiledPackageRef, i.packagesPath)
if err != nil {
return bosherr.WrapErrorf(err, "Installing package '%s'", compiledPackageRef.Name)
}
}
return nil
})
if err != nil {
return nil, err
}
renderedCPIJob := state.RenderedCPIJob()
installedJob, err := i.jobInstaller.Install(renderedCPIJob, stage)
if err != nil {
return nil, bosherr.WrapErrorf(err, "Installing job '%s' for CPI release", renderedCPIJob.Name)
}
return NewInstallation(
i.target,
installedJob,
manifest,
i.registryServerManager,
), nil
}