This repository has been archived by the owner on Jan 21, 2022. It is now read-only.
/
nats_service.go
95 lines (78 loc) · 2.22 KB
/
nats_service.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
package dummy
import (
"bytes"
"text/template"
"time"
bltassets "github.com/cloudfoundry-incubator/bosh-load-tests/assets"
bltcom "github.com/cloudfoundry-incubator/bosh-load-tests/command"
bosherr "github.com/cloudfoundry/bosh-utils/errors"
boshsys "github.com/cloudfoundry/bosh-utils/system"
)
type NatsServerOptions struct {
AssetsPath string
Port int
}
type NatsService struct {
options NatsServerOptions
natsStartCommand string
cmdRunner boshsys.CmdRunner
process boshsys.Process
assetsProvider bltassets.Provider
fs boshsys.FileSystem
portWaiter PortWaiter
}
func NewNatsService(
options NatsServerOptions,
natsStartCommand string,
cmdRunner boshsys.CmdRunner,
assetsProvider bltassets.Provider,
fs boshsys.FileSystem,
portWaiter PortWaiter,
) *NatsService {
return &NatsService{
options: options,
natsStartCommand: natsStartCommand,
cmdRunner: cmdRunner,
assetsProvider: assetsProvider,
fs: fs,
portWaiter: portWaiter,
}
}
func (s *NatsService) Start() error {
natsTemplatePath, err := s.assetsProvider.FullPath("nats/nats.template")
if err != nil {
return err
}
configPath, err := s.renderConfig(natsTemplatePath)
if err != nil {
return err
}
natsStartCommand := bltcom.CreateCommand(s.natsStartCommand)
natsStartCommand.Args = append(natsStartCommand.Args, "-c", configPath, "-T", "-D", "-V")
s.process, err = s.cmdRunner.RunComplexCommandAsync(natsStartCommand)
if err != nil {
return bosherr.WrapError(err, "starting nats server")
}
s.process.Wait()
return s.portWaiter.Wait("NatsService", "127.0.0.1", s.options.Port)
}
func (s *NatsService) Stop() {
s.process.TerminateNicely(5 * time.Second)
}
func (s *NatsService) renderConfig(natsTemplatePath string) (string, error) {
configTemplate := template.Must(template.ParseFiles(natsTemplatePath))
buffer := bytes.NewBuffer([]byte{})
err := configTemplate.Execute(buffer, s.options)
if err != nil {
return "", err
}
renderedConfig, err := s.fs.TempFile("nats-config")
if err != nil {
return "", err
}
err = s.fs.WriteFile(renderedConfig.Name(), buffer.Bytes())
if err != nil {
return "", err
}
return renderedConfig.Name(), nil
}