/
init.go
142 lines (119 loc) · 3.58 KB
/
init.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
//
// command/init.go
//
// Copyright (c) 2016-2017 Junpei Kawamoto
//
// This file is part of Roadie.
//
// Roadie is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Roadie is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Roadie. If not, see <http://www.gnu.org/licenses/>.
//
package command
import (
"fmt"
"strings"
"github.com/jkawamoto/roadie/config"
"github.com/ttacon/chalk"
"github.com/deiwin/interact"
"github.com/urfave/cli"
)
// CmdInit helps to create a configuration file.
func CmdInit(c *cli.Context) (err error) {
// If metadata don't have complete information, it's okay for now.
m, _ := getMetadata(c)
err = cmdInit(m)
if err != nil {
return cli.NewExitError(err, 2)
}
return
}
// cmdInit initialize Roadie.
// The initialization steps:
// 1. Choose cloud service provider (GCP only).
// 2. Ask nessesarry information (project id for gcp).
// 3. Authentication.
// 4. Store configurations.
func cmdInit(m *Metadata) (err error) {
if m.Config == nil {
m.Config = new(config.Config)
}
if m.Config.FileName == "" {
m.Config.FileName = ConfigFile
}
fmt.Fprintf(m.Stdout, `%v
This command will create file %q in current directory.
Configurations can be updated with "roadie config" command.
See "roadie config --help", for more detail.
`, chalk.Green.Color("Initialize Roadie"), m.Config.FileName)
actor := interact.NewActor(m.Stdin, m.Stdout)
provider, err := actor.PromptOptionalAndRetry("Choose a cloud provider from a) Microsoft Azure, g) Google Cloud Platform", "g", checkOption("a", "g"))
if err != nil {
return
}
switch provider {
case "a":
var tennant, subscription, project string
tennant, err = actor.PromptAndRetry("Enter your tennant ID", checkNotEmpty)
if err != nil {
return
}
fmt.Fprintln(m.Stdout, "")
m.Config.AzureConfig.TenantID = tennant
subscription, err = actor.PromptAndRetry("Enter your subscription ID", checkNotEmpty)
if err != nil {
return
}
fmt.Fprintln(m.Stdout, "")
m.Config.AzureConfig.SubscriptionID = subscription
project, err = actor.PromptAndRetry("Enter your project ID", checkNotEmpty)
if err != nil {
return
}
fmt.Fprintln(m.Stdout, "")
m.Config.AzureConfig.ProjectID = project
case "g":
var project string
project, err = actor.PromptAndRetry("Enter your project ID", checkNotEmpty)
if err != nil {
return
}
fmt.Fprintln(m.Stdout, "")
m.Config.GcpConfig.Project = project
}
fmt.Fprintln(m.Stdout, chalk.Green.Color("Cheking authorization..."))
err = m.prepareProvider(true)
if err != nil {
return
}
fmt.Fprintln(m.Stdout, chalk.Green.Color("Saving configuarions..."))
return m.Config.Save()
}
// checkNotEmpty is a predicate used in actor to check input message is empty.
func checkNotEmpty(value string) error {
if value == "" {
return fmt.Errorf("Input value is empty.")
}
return nil
}
// checkOption returns InputCheck checks a given string matches at least one of
// given options.
func checkOption(options ...string) interact.InputCheck {
return func(str string) error {
for _, v := range options {
if v == str {
return nil
}
}
return fmt.Errorf("Input must be one of [%v]", strings.Join(options, ", "))
}
}