-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.go
131 lines (109 loc) · 4.4 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
package main
import (
"context"
"fmt"
"os"
"github.com/giantswarm/microerror"
"github.com/giantswarm/microkit/command"
microserver "github.com/giantswarm/microkit/server"
"github.com/giantswarm/micrologger"
"github.com/spf13/viper"
"github.com/giantswarm/chart-operator/v3/flag"
"github.com/giantswarm/chart-operator/v3/pkg/project"
"github.com/giantswarm/chart-operator/v3/server"
"github.com/giantswarm/chart-operator/v3/service"
)
var (
f = flag.New()
)
func main() {
err := mainWithError()
if err != nil {
panic(fmt.Sprintf("%#v\n", err))
}
}
func mainWithError() error {
var err error
ctx := context.Background()
// Create a new logger that is used by all packages.
var newLogger micrologger.Logger
{
c := micrologger.Config{
IOWriter: os.Stdout,
}
newLogger, err = micrologger.New(c)
if err != nil {
return microerror.Mask(err)
}
}
// Define server factory to create the custom server once all command line
// flags are parsed and all microservice configuration is processed.
newServerFactory := func(v *viper.Viper) microserver.Server {
// New custom service implements the business logic.
var newService *service.Service
{
c := service.Config{
Logger: newLogger,
Flag: f,
Viper: v,
}
newService, err = service.New(c)
if err != nil {
panic(fmt.Sprintf("%#v\n", microerror.Mask(err)))
}
go newService.Boot(ctx)
}
// New custom server that bundles microkit endpoints.
var newServer microserver.Server
{
c := server.Config{
Logger: newLogger,
Service: newService,
Viper: v,
}
newServer, err = server.New(c)
if err != nil {
panic(fmt.Sprintf("%#v\n", microerror.Mask(err)))
}
}
return newServer
}
// Create a new microkit command that manages operator daemon.
var newCommand command.Command
{
c := command.Config{
Logger: newLogger,
ServerFactory: newServerFactory,
Description: project.Description(),
GitCommit: project.GitSHA(),
Name: project.Name(),
Source: project.Source(),
Version: project.Version(),
}
newCommand, err = command.New(c)
if err != nil {
return microerror.Mask(err)
}
}
daemonCommand := newCommand.DaemonCommand().CobraCommand()
daemonCommand.PersistentFlags().String(f.Service.Controller.ResyncPeriod, "5m", "Duration after which a complete sync with all known runtime objects the controller watches is performed.")
daemonCommand.PersistentFlags().String(f.Service.Helm.HTTP.ClientTimeout, "5s", "HTTP timeout for pulling chart tarballs.")
daemonCommand.PersistentFlags().String(f.Service.Helm.Kubernetes.WaitTimeout, "10s", "Wait timeout when calling the Kubernetes API.")
daemonCommand.PersistentFlags().Int(f.Service.Helm.MaxRollback, 3, "the maximum number of rollback attempts for pending apps.")
daemonCommand.PersistentFlags().StringSlice(f.Service.Helm.NamespaceWhitelist, []string{}, "Namespaces to use the privileged Helm Client for.")
daemonCommand.PersistentFlags().Bool(f.Service.Helm.SplitClient, false, "Use separate Helm Client for apps outside Giantswarm-protected namespace.")
daemonCommand.PersistentFlags().String(f.Service.Helm.TillerNamespace, "giantswarm", "Namespace for the Tiller pod.")
daemonCommand.PersistentFlags().String(f.Service.Image.Registry, "quay.io", "Container image registry.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.Address, "", "Address used to connect to Kubernetes. When empty in-cluster config is created.")
daemonCommand.PersistentFlags().Bool(f.Service.Kubernetes.InCluster, false, "Whether to use the in-cluster config to authenticate with Kubernetes.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.KubeConfig, "", "KubeConfig used to connect to Kubernetes. When empty other settings are used.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.Watch.Namespace, "", "Namespace for watching for Kubernetes resources.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.TLS.CAFile, "", "Certificate authority file path to use to authenticate with Kubernetes.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.TLS.CrtFile, "", "Certificate file path to use to authenticate with Kubernetes.")
daemonCommand.PersistentFlags().String(f.Service.Kubernetes.TLS.KeyFile, "", "Key file path to use to authenticate with Kubernetes.")
err = newCommand.CobraCommand().Execute()
if err != nil {
return microerror.Mask(err)
}
return nil
}