This repository has been archived by the owner on Jun 3, 2021. It is now read-only.
/
main.go
151 lines (129 loc) · 3.63 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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package main
import (
"fmt"
"golang.org/x/crypto/ssh/terminal"
"os"
"os/signal"
"strings"
"syscall"
"github.com/f5devcentral/f5-ipam-controller/pkg/controller"
"github.com/f5devcentral/f5-ipam-controller/pkg/manager"
"github.com/f5devcentral/f5-ipam-controller/pkg/orchestration"
log "github.com/f5devcentral/f5-ipam-controller/pkg/vlogger"
clog "github.com/f5devcentral/f5-ipam-controller/pkg/vlogger/console"
flag "github.com/spf13/pflag"
)
const (
DefaultProvider = manager.F5IPAMProvider
)
var (
// Flag sets and supported flags
flags *flag.FlagSet
globalFlags *flag.FlagSet
providerFlags *flag.FlagSet
// Global
logLevel *string
orch *string
provider *string
// Provider
iprange *string
)
func init() {
flags = flag.NewFlagSet("main", flag.ContinueOnError)
globalFlags = flag.NewFlagSet("Global", flag.ContinueOnError)
providerFlags = flag.NewFlagSet("Provider", flag.ContinueOnError)
//Flag terminal wrapping
var err error
var width int
fd := int(os.Stdout.Fd())
if terminal.IsTerminal(fd) {
width, _, err = terminal.GetSize(fd)
if nil != err {
width = 0
}
}
// Global flags
logLevel = globalFlags.String("log-level", "INFO", "Optional, logging level.")
orch = globalFlags.String("orchestration", "",
"Required, orchestration that the controller is running in.")
provider = globalFlags.String("ip-provider", DefaultProvider,
"Required, the IPAM system that the controller will interface with.")
iprange = providerFlags.String("ip-range", "",
"Optional, the Default Provider needs iprange to build pools of IP Addresses")
globalFlags.Usage = func() {
_, _ = fmt.Fprintf(os.Stderr, " Global:\n%s\n", globalFlags.FlagUsagesWrapped(width))
}
providerFlags.Usage = func() {
_, _ = fmt.Fprintf(os.Stderr, " Provider:\n%s\n", providerFlags.FlagUsagesWrapped(width))
}
flags.AddFlagSet(globalFlags)
flags.AddFlagSet(providerFlags)
flags.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage of %s\n", os.Args[0])
globalFlags.Usage()
providerFlags.Usage()
}
}
func verifyArgs() error {
log.RegisterLogger(
log.LL_MIN_LEVEL, log.LL_MAX_LEVEL, clog.NewConsoleLogger())
if ll := log.NewLogLevel(*logLevel); nil != ll {
log.SetLogLevel(*ll)
} else {
return fmt.Errorf("Unknown log level requested: %v\n"+
" Valid log levels are: DEBUG, INFO, WARNING, ERROR, CRITICAL", logLevel)
}
if len(*orch) == 0 {
return fmt.Errorf("orchestration is required")
}
*orch = strings.ToLower(*orch)
*provider = strings.ToLower(*provider)
if len(*iprange) == 0 && *provider == DefaultProvider {
return fmt.Errorf("IP Range not provider for Provider: %v", DefaultProvider)
}
*iprange = strings.Trim(*iprange, "\"")
*iprange = strings.Trim(*iprange, "'")
return nil
}
func main() {
err := flags.Parse(os.Args)
if nil != err {
os.Exit(1)
}
err = verifyArgs()
if nil != err {
fmt.Fprintf(os.Stderr, "%v\n", err)
flags.Usage()
os.Exit(1)
}
orcr := orchestration.NewOrchestrator()
if orcr == nil {
log.Error("Unable to create IPAM Client")
os.Exit(1)
}
mgrParams := manager.Params{
Provider: *provider,
IPAMManagerParams: manager.IPAMManagerParams{Range: *iprange},
}
mgrParams.Range = *iprange
mgr, err := manager.NewManager(mgrParams)
if err != nil {
log.Errorf("Unable to initialize manager: %v", err)
os.Exit(1)
}
stopCh := make(chan struct{})
ctlr := controller.NewController(
controller.Spec{
Orchestrator: orcr,
Manager: mgr,
StopCh: stopCh,
},
)
ctlr.Start()
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
sig := <-signals
ctlr.Stop()
log.Infof("Exiting - signal %v\n", sig)
close(stopCh)
}