/
main.go
136 lines (130 loc) · 4.32 KB
/
main.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"syscall"
"time"
"github.com/Cloud-Foundations/Dominator/fleetmanager/httpd"
"github.com/Cloud-Foundations/Dominator/fleetmanager/hypervisors"
"github.com/Cloud-Foundations/Dominator/fleetmanager/hypervisors/fsstorer"
"github.com/Cloud-Foundations/Dominator/fleetmanager/rpcd"
"github.com/Cloud-Foundations/Dominator/fleetmanager/topology"
"github.com/Cloud-Foundations/Dominator/lib/constants"
"github.com/Cloud-Foundations/Dominator/lib/flags/loadflags"
"github.com/Cloud-Foundations/Dominator/lib/json"
"github.com/Cloud-Foundations/Dominator/lib/log"
"github.com/Cloud-Foundations/Dominator/lib/log/serverlogger"
"github.com/Cloud-Foundations/Dominator/lib/srpc"
"github.com/Cloud-Foundations/Dominator/lib/srpc/proxy"
"github.com/Cloud-Foundations/Dominator/lib/srpc/setupserver"
"github.com/Cloud-Foundations/tricorder/go/tricorder"
)
const (
dirPerms = syscall.S_IRWXU | syscall.S_IRGRP | syscall.S_IXGRP |
syscall.S_IROTH | syscall.S_IXOTH
)
var (
checkTopology = flag.Bool("checkTopology", false,
"If true, perform a one-time check, write to stdout and exit")
ipmiPasswordFile = flag.String("ipmiPasswordFile", "",
"Name of password file used to authenticate for IPMI requests")
ipmiUsername = flag.String("ipmiUsername", "",
"Name of user to authenticate as when making IPMI requests")
topologyCheckInterval = flag.Duration("topologyCheckInterval",
time.Minute, "Configuration check interval")
portNum = flag.Uint("portNum", constants.FleetManagerPortNumber,
"Port number to allocate and listen on for HTTP/RPC")
stateDir = flag.String("stateDir", "/var/lib/fleet-manager",
"Name of state directory")
topologyDir = flag.String("topologyDir", "",
"Name of local topology directory or directory in Git repository")
topologyRepository = flag.String("topologyRepository", "",
"URL of Git repository containing repository")
variablesDir = flag.String("variablesDir", "",
"Name of local variables directory or directory in Git repository")
)
func doCheck(logger log.DebugLogger) {
topo, err := topology.LoadWithParams(topology.Params{
Logger: logger,
TopologyDir: *topologyDir,
VariablesDir: *variablesDir,
})
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
if err := json.WriteWithIndent(os.Stdout, " ", topo); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
os.Exit(0)
}
func main() {
if err := loadflags.LoadForDaemon("fleet-manager"); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
flag.Parse()
tricorder.RegisterFlags()
logger := serverlogger.New("")
srpc.SetDefaultLogger(logger)
if *checkTopology {
doCheck(logger)
}
params := setupserver.Params{Logger: logger}
if err := setupserver.SetupTlsWithParams(params); err != nil {
logger.Fatalln(err)
}
if err := proxy.New(logger); err != nil {
logger.Fatalln(err)
}
if err := os.MkdirAll(*stateDir, dirPerms); err != nil {
logger.Fatalf("Cannot create state directory: %s\n", err)
}
topologyChannel, err := topology.WatchWithParams(topology.WatchParams{
Params: topology.Params{
Logger: logger,
TopologyDir: *topologyDir,
VariablesDir: *variablesDir,
},
CheckInterval: *topologyCheckInterval,
LocalRepositoryDir: filepath.Join(*stateDir, "topology"),
TopologyRepository: *topologyRepository,
},
)
if err != nil {
logger.Fatalf("Cannot watch for topology: %s\n", err)
}
storer, err := fsstorer.New(filepath.Join(*stateDir, "hypervisor-db"),
logger)
if err != nil {
logger.Fatalf("Cannot create DB: %s\n", err)
}
hyperManager, err := hypervisors.New(hypervisors.StartOptions{
IpmiPasswordFile: *ipmiPasswordFile,
IpmiUsername: *ipmiUsername,
Logger: logger,
Storer: storer,
})
if err != nil {
logger.Fatalf("Cannot create hypervisors manager: %s\n", err)
}
rpcHtmlWriter, err := rpcd.Setup(hyperManager, logger)
if err != nil {
logger.Fatalf("Cannot start rpcd: %s\n", err)
}
webServer, err := httpd.StartServer(*portNum, logger)
if err != nil {
logger.Fatalf("Unable to create http server: %s\n", err)
}
webServer.AddHtmlWriter(hyperManager)
webServer.AddHtmlWriter(rpcHtmlWriter)
webServer.AddHtmlWriter(logger)
for topology := range topologyChannel {
logger.Println("Received new topology")
webServer.UpdateTopology(topology)
hyperManager.UpdateTopology(topology)
}
}