This repository has been archived by the owner on Jan 21, 2022. It is now read-only.
/
config.go
117 lines (94 loc) · 3.08 KB
/
config.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package config
import (
"errors"
"fmt"
"github.com/pivotal-cf-experimental/service-config"
"gopkg.in/validator.v2"
"flag"
"code.cloudfoundry.org/cflager"
"code.cloudfoundry.org/lager"
)
type Config struct {
LogFileLocation string `yaml:"LogFileLocation" validate:"nonzero"`
PidFile string `yaml:"PidFile" validate:"nonzero"`
ChildPidFile string `yaml:"ChildPidFile" validate:"nonzero"`
Db DBHelper `yaml:"Db"`
Manager StartManager `yaml:"Manager"`
Upgrader Upgrader `yaml:"Upgrader"`
Prestart bool
Logger lager.Logger
}
type DBHelper struct {
DaemonPath string `yaml:"DaemonPath" validate:"nonzero"`
UpgradePath string `yaml:"UpgradePath" validate:"nonzero"`
User string `yaml:"User" validate:"nonzero"`
Password string `yaml:"Password"`
PreseededDatabases []PreseededDatabase `yaml:"PreseededDatabases"`
PostStartSQLFiles []string `yaml:"PostStartSQLFiles"`
Socket string `yaml:"Socket"`
}
type StartManager struct {
StateFileLocation string `yaml:"StateFileLocation" validate:"nonzero"`
GrastateFileLocation string
ClusterIps []string `yaml:"ClusterIps" validate:"nonzero"`
BootstrapNode bool `yaml:"BootstrapNode"`
ClusterProbeTimeout int `yaml:"ClusterProbeTimeout" validate:"nonzero"`
}
type Upgrader struct {
PackageVersionFile string `yaml:"PackageVersionFile" validate:"nonzero"`
LastUpgradedVersionFile string `yaml:"LastUpgradedVersionFile" validate:"nonzero"`
}
type PreseededDatabase struct {
DBName string `yaml:"DBName" validate:"nonzero"`
User string `yaml:"User" validate:"nonzero"`
Password string `yaml:"Password"`
}
func NewConfig(osArgs []string) (*Config, error) {
var c Config
binaryName := osArgs[0]
configurationOptions := osArgs[1:]
serviceConfig := service_config.New()
flags := flag.NewFlagSet(binaryName, flag.ExitOnError)
cflager.AddFlags(flags)
serviceConfig.AddFlags(flags)
serviceConfig.AddDefaults(Config{
Db: DBHelper{
User: "root",
},
Manager: StartManager{
GrastateFileLocation: "/var/vcap/store/mysql/grastate.dat",
},
})
flags.Parse(configurationOptions)
err := serviceConfig.Read(&c)
c.Logger, _ = cflager.New(binaryName)
return &c, err
}
func (c Config) Validate() error {
errString := ""
err := validator.Validate(c)
if err != nil {
errString += formatErrorString(err, "")
}
for i, db := range c.Db.PreseededDatabases {
dbErr := validator.Validate(db)
if dbErr != nil {
errString += formatErrorString(
dbErr,
fmt.Sprintf("Db.PreseededDatabases[%d].", i),
)
}
}
if len(errString) > 0 {
return errors.New(fmt.Sprintf("Validation errors: %s\n", errString))
}
return nil
}
func formatErrorString(err error, keyPrefix string) string {
errs := err.(validator.ErrorMap)
var errsString string
for fieldName, validationMessage := range errs {
errsString += fmt.Sprintf("%s%s : %s\n", keyPrefix, fieldName, validationMessage)
}
return errsString
}