1package installation
2
3import (
4	biinstallmanifest "github.com/cloudfoundry/bosh-cli/installation/manifest"
5	biregistry "github.com/cloudfoundry/bosh-cli/registry"
6	biui "github.com/cloudfoundry/bosh-cli/ui"
7	bosherr "github.com/cloudfoundry/bosh-utils/errors"
8	boshlog "github.com/cloudfoundry/bosh-utils/logger"
9)
10
11type Installation interface {
12	Target() Target
13	Job() InstalledJob
14	WithRunningRegistry(boshlog.Logger, biui.Stage, func() error) error
15	StartRegistry() error
16	StopRegistry() error
17}
18
19type installation struct {
20	target                Target
21	job                   InstalledJob
22	manifest              biinstallmanifest.Manifest
23	registryServerManager biregistry.ServerManager
24
25	registryServer biregistry.Server
26}
27
28func NewInstallation(
29	target Target,
30	job InstalledJob,
31	manifest biinstallmanifest.Manifest,
32	registryServerManager biregistry.ServerManager,
33) Installation {
34	return &installation{
35		target:                target,
36		job:                   job,
37		manifest:              manifest,
38		registryServerManager: registryServerManager,
39	}
40}
41
42func (i *installation) Target() Target {
43	return i.target
44}
45
46func (i *installation) Job() InstalledJob {
47	return i.job
48}
49
50func (i *installation) WithRunningRegistry(logger boshlog.Logger, stage biui.Stage, fn func() error) error {
51	err := stage.Perform("Starting registry", func() error {
52		return i.StartRegistry()
53	})
54	if err != nil {
55		return err
56	}
57	defer i.stopRegistryNice(logger, stage)
58	return fn()
59}
60
61func (i *installation) stopRegistryNice(logger boshlog.Logger, stage biui.Stage) {
62	err := stage.Perform("Stopping registry", func() error {
63		return i.StopRegistry()
64	})
65	if err != nil {
66		logger.Warn("installation", "Registry failed to stop: %s", err)
67	}
68}
69
70func (i *installation) StartRegistry() error {
71	if !i.manifest.Registry.IsEmpty() {
72		if i.registryServer != nil {
73			return bosherr.Error("Registry already started")
74		}
75		config := i.manifest.Registry
76		registryServer, err := i.registryServerManager.Start(config.Username, config.Password, config.Host, config.Port)
77		if err != nil {
78			return bosherr.WrapError(err, "Starting registry")
79		}
80		i.registryServer = registryServer
81	}
82	return nil
83}
84
85func (i *installation) StopRegistry() error {
86	if !i.manifest.Registry.IsEmpty() {
87		if i.registryServer == nil {
88			return bosherr.Error("Registry must be started before it can be stopped")
89		}
90		err := i.registryServer.Stop()
91		if err != nil {
92			return bosherr.WrapError(err, "Stopping registry")
93		}
94		i.registryServer = nil
95	}
96	return nil
97}
98