/
main.go
120 lines (103 loc) · 2.75 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
package main
import (
"os"
"github.com/krystal/go-katapult/core"
"github.com/krystal/katapult-cli/config"
"github.com/spf13/cobra"
)
func run() error {
var (
configFileFlag string
configURLFlag string
configAPIToken string
)
conf, err := config.New()
if err != nil {
return err
}
var help bool
rootCmd := &cobra.Command{
Use: "katapult",
Short: "katapult CLI tool",
Long: `katapult is a CLI tool for the katapult.io hosting platform.`,
FParseErrWhitelist: cobra.FParseErrWhitelist{
UnknownFlags: true,
},
PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
if help {
err = cmd.Usage()
if err != nil {
return err
}
os.Exit(0)
}
return nil
},
SilenceUsage: true,
}
rootFlags := rootCmd.PersistentFlags()
rootFlags.BoolVarP(&help, "help", "h", false, "Display the help for the command/root.")
rootFlags.StringVarP(&outputFlag, "output", "o", "", "output type (yaml, json, text)")
rootFlags.StringVar(&templateFlag, "format", "", "defines the output template for text")
rootFlags.StringVar(&configFileFlag, "config-path", "",
"config file (default: $HOME/.katapult/katapult.yaml)")
apiURLDefault := config.Defaults.APIURL
if apiURLDefault != "" {
apiURLDefault = " (default: " + apiURLDefault + ")"
}
rootFlags.StringVar(&configURLFlag, "api-url", "", "URL for Katapult API"+apiURLDefault)
err = conf.BindPFlag("api_url", rootFlags.Lookup("api-url"))
if err != nil {
return err
}
tokenDefault := config.Defaults.APIToken
if tokenDefault != "" {
tokenDefault = " (default: " + tokenDefault + ")"
}
rootFlags.StringVar(&configAPIToken, "api-token", "", "Katapult API Token"+tokenDefault)
err = conf.BindPFlag("api_token", rootFlags.Lookup("api-token"))
if err != nil {
return err
}
err = rootCmd.ParseFlags(os.Args)
if err != nil {
return err
}
if configFileFlag != "" {
conf.SetConfigFile(configFileFlag)
}
if err = conf.Load(); err != nil {
return err
}
cl, err := newClient(conf)
if err != nil {
return err
}
rootCmd.AddCommand(
authCommand(conf),
versionCommand(),
configCommand(conf),
dataCentersCmd(core.NewDataCentersClient(cl)),
networksCmd(core.NewNetworksClient(cl)),
organizationsCmd(core.NewOrganizationsClient(cl)),
virtualMachinesCmd(
core.NewVirtualMachinesClient(cl),
core.NewOrganizationsClient(cl),
core.NewDataCentersClient(cl),
core.NewVirtualMachinePackagesClient(cl),
core.NewDiskTemplatesClient(cl),
core.NewIPAddressesClient(cl),
core.NewSSHKeysClient(cl),
core.NewTagsClient(cl),
core.NewVirtualMachineBuildsClient(cl),
nil, nil),
)
return rootCmd.Execute()
}
func main() {
err := run()
if err != nil {
// Ensure we exit with status code 1. The actual printing is done by Cobra.
os.Exit(1)
}
}