/
main.go
107 lines (86 loc) · 3.17 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
/*
Copyright 2020 The Kubermatic Kubernetes Platform contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"fmt"
"math/rand"
"os"
"time"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"k8c.io/kubermatic/v3/pkg/log"
"k8c.io/kubermatic/v3/pkg/util/edition"
kubermaticversion "k8c.io/kubermatic/v3/pkg/version/kubermatic"
)
type Options struct {
Verbose bool
LogFormat log.LogrusFormat
ChartsDirectory string
}
func (o *Options) CopyInto(other *Options) {
other.ChartsDirectory = o.ChartsDirectory
other.Verbose = o.Verbose
}
var options = &Options{}
func main() {
rand.Seed(time.Now().UnixNano())
logger := log.NewLogrus()
versions := kubermaticversion.NewDefaultVersions(edition.CommunityEdition)
rootCmd := &cobra.Command{
Use: "kubermatic-installer",
Short: "Installs and updates Kubermatic Kubernetes Platform",
Version: versions.Kubermatic,
SilenceErrors: true,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
if env := os.Getenv("KUBERMATIC_CHARTS_DIRECTORY"); env != "" {
options.ChartsDirectory = env
}
if options.ChartsDirectory == "" {
options.ChartsDirectory = "charts"
}
if options.Verbose {
logger.SetLevel(logrus.DebugLevel)
}
switch options.LogFormat {
case log.LogrusFormatJSON:
logger.SetFormatter(&logrus.JSONFormatter{})
case "", log.LogrusFormatConsole:
logger.SetFormatter(&logrus.TextFormatter{})
}
},
}
// cobra does not make any distinction between "error that happened because of bad flags"
// and "error that happens because of something going bad inside the RunE function", and
// so would always show the Usage, no matter what error occurred. Tow ork around this, we
// set SilenceUsages on all commands and manually print the error using the FlagErrorFunc.
rootCmd.SetFlagErrorFunc(func(c *cobra.Command, err error) error {
if err := c.Usage(); err != nil {
return err
}
// ensure we exit with code 1 later on
return err
})
rootCmd.PersistentFlags().BoolVarP(&options.Verbose, "verbose", "v", options.Verbose, "enable more verbose output")
rootCmd.PersistentFlags().VarP(&options.LogFormat, "output", "o", fmt.Sprintf("write logs in a specific output format. supported formats: %s", log.AvailableLogrusFormats.String()))
rootCmd.PersistentFlags().StringVar(&options.ChartsDirectory, "charts-directory", "", "filesystem path to the Kubermatic Helm charts (defaults to charts/)")
rootCmd.AddCommand(
ConvertKubeconfigCommand(logger),
DeployCommand(logger, versions),
PrintCommand(),
VersionCommand(logger, versions),
MirrorImagesCommand(logger, versions),
)
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}