forked from flynn/flynn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstall.go
135 lines (116 loc) · 3.43 KB
/
install.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
package main
import (
"errors"
"fmt"
"os"
"strconv"
"github.com/flynn/flynn/Godeps/_workspace/src/github.com/awslabs/aws-sdk-go/aws"
"github.com/flynn/flynn/Godeps/_workspace/src/github.com/flynn/go-docopt"
"github.com/flynn/flynn/installer"
)
func init() {
register("install", runInstaller, fmt.Sprintf(`
usage: flynn install <target> [-n <instances>] [-t <instance-type>] [--aws-access-key-id=<key-id>] [--aws-secret-access-key=<secret>] [--aws-region=<region>] [--vpc-cidr=<cidr>] [--subnet-cidr=<cidr>]
Targets:
aws creates a flynn cluster on EC2
Options:
-n <instances>, --instances=<instances> Number of instances to launch [default: 1]
-t <instance-type>, --type=<instance-type> Type of instances to launch [default: %s]
--aws-access-key-id=<key-id> AWS access key ID. Defaults to $AWS_ACCESS_KEY_ID
--aws-secret-access-key=<secret> AWS access key secret. Defaults to $AWS_SECRET_ACCESS_KEY
--aws-region=<region> AWS region [default: us-east-1]
--vpc-cidr=<cidr> CIDR block to assign to the VPC. [default: 10.0.0.0/16]
--subnet-cidr=<cidr> CIDR block to assign to the subnet. [default: 10.0.0.0/21]
Examples:
$ flynn install aws --aws-access-key-id=asdf --aws-secret-access-key=fdsa
`, installer.DefaultInstanceType))
}
func runInstaller(args *docopt.Args) error {
if args.String["<target>"] != "aws" {
return errors.New("Invalid install target")
}
var creds aws.CredentialsProvider
key := args.String["--aws-access-key-id"]
secret := args.String["--aws-secret-access-key"]
if key != "" && secret != "" {
creds = aws.Creds(key, secret, "")
} else {
var err error
creds, err = aws.EnvCreds()
if err != nil {
return err
}
}
instanceType := args.String["--type"]
region := args.String["--aws-region"]
if region == "" {
region = "us-east-1"
}
instances := 1
if args.String["--instances"] != "" {
var err error
instances, err = strconv.Atoi(args.String["--instances"])
if err != nil {
return err
}
}
vpcCidr := args.String["--vpc-cidr"]
if vpcCidr == "" {
vpcCidr = "10.0.0.0/21"
}
subnetCidr := args.String["--subnet-cidr"]
if subnetCidr == "" {
subnetCidr = "10.0.0.0/21"
}
stack := &installer.Stack{
NumInstances: instances,
InstanceType: instanceType,
Region: region,
VpcCidr: vpcCidr,
SubnetCidr: subnetCidr,
Creds: creds,
YesNoPrompt: promptYesNo,
PromptInput: promptInput,
}
if err := stack.RunAWS(); err != nil {
return err
}
exitCode := 0
outer:
for {
select {
case event := <-stack.EventChan:
fmt.Println(event.Description)
case err := <-stack.ErrChan:
fmt.Printf("Oops, something went wrong: %s\n", err.Error())
exitCode = 1
case <-stack.Done:
if exitCode != 0 {
os.Exit(exitCode)
}
break outer
}
}
if err := readConfig(); err != nil {
return err
}
if err := config.Add(stack.ClusterConfig(), true); err != nil {
return err
}
config.SetDefault(stack.StackName)
if err := config.SaveTo(configPath()); err != nil {
return err
}
msg, _ := stack.DashboardLoginMsg()
fmt.Printf("\n\nThe cluster has been successfully deployed to AWS and configured locally.\n\n%s\n\n", msg)
return nil
}
func promptInput(msg string) (result string) {
fmt.Print(msg)
fmt.Print(": ")
for {
var answer string
fmt.Scanln(&answer)
return answer
}
}