-
Notifications
You must be signed in to change notification settings - Fork 1
/
cluster_create.go
118 lines (100 loc) · 5.71 KB
/
cluster_create.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
// Copyright (c) 2016 Pulcy.
//
// 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"
"strings"
"github.com/dchest/uniuri"
"github.com/spf13/cobra"
"github.com/pulcy/quark/providers"
)
var (
cmdCreateCluster = &cobra.Command{
Use: "create",
Run: createCluster,
}
createClusterFlags providers.CreateClusterOptions
)
func init() {
cmdCreateCluster.Flags().StringVar(&createClusterFlags.ID, "cluster-id", "", "Cluster ID (for vault-monkey)")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.Domain, "domain", defaultDomain(), "Cluster domain")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.Name, "name", "", "Cluster name")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.ImageID, "image", "", "OS image to run on new instances")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.RegionID, "region", "", "Region to create the instances in")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.TypeID, "type", "", "Type of the new instances")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.MinOSVersion, "min-os-version", defaultMinOSVersion, "Minimum version of the OS")
cmdCreateCluster.Flags().IntVar(&createClusterFlags.InstanceCount, "instance-count", defaultInstanceCount, "Number of instances in cluster")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.GluonImage, "gluon-image", defaultGluonImage, "Image containing gluon")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.RebootStrategy, "reboot-strategy", defaultRebootStrategy, "CoreOS reboot strategy")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.PrivateRegistryUrl, "private-registry-url", defaultPrivateRegistryUrl(), "URL of private docker registry")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.PrivateRegistryUserName, "private-registry-username", defaultPrivateRegistryUserName(), "Username for private registry")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.PrivateRegistryPassword, "private-registry-password", defaultPrivateRegistryPassword(), "Password for private registry")
cmdCreateCluster.Flags().StringSliceVar(&createClusterFlags.SSHKeyNames, "ssh-key", defaultSshKeys(), "Names of SSH keys to add to instances")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.SSHKeyGithubAccount, "ssh-key-github-account", defaultSshKeyGithubAccount(), "Github account name used to fetch SSH keys (to add to instances)")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.TincCIDR, "tinc-cidr", "", "CIDR of the TINC network in this cluster")
cmdCreateCluster.Flags().BoolVar(&createClusterFlags.RegisterInstance, "register-instance", defaultRegisterInstance(), "If set, the instances will be registered with their instance name in DNS")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.HttpProxy, "http-proxy", "", "Address of HTTP proxy to use on instances")
cmdCreateCluster.Flags().StringVar(&createClusterFlags.WeavePassword, "weave-password", "", "Password of the weave network")
cmdCreateCluster.Flags().BoolVar(&createClusterFlags.EnableFleet, "fleet-enabled", true, "If set, Fleet will be installed on the cluster")
cmdCreateCluster.Flags().BoolVar(&createClusterFlags.EnableKubernetes, "kubernetes-enabled", true, "If set, Kubernetes will be installed on the cluster")
cmdCluster.AddCommand(cmdCreateCluster)
}
func createCluster(cmd *cobra.Command, args []string) {
createClusterFlags.VaultAddress = vaultCfg.VaultAddr
createClusterFlags.VaultCertificatePath = vaultCfg.VaultCACert
createClusterFlags.VaultServerKeyPath = vaultCfg.VaultCAKey
createClusterFlags.VaultServerKeyCommand = vaultCfg.VaultCAKeyCommand
requireProfile := false
loadArgumentsFromCluster(cmd.Flags(), requireProfile)
clusterInfoFromArgs(&createClusterFlags.ClusterInfo, args)
provider := newProvider()
createClusterFlags = provider.CreateClusterDefaults(createClusterFlags)
// Create cluster ID if needed
if createClusterFlags.ID == "" {
createClusterFlags.ID = strings.ToLower(uniuri.NewLen(40))
} else {
createClusterFlags.ID = strings.ToLower(createClusterFlags.ID)
}
// Create weave password if needed
if createClusterFlags.WeavePassword == "" {
createClusterFlags.WeavePassword = uniuri.NewLen(40)
}
// Validate
if err := createClusterFlags.Validate(); err != nil {
Exitf("Create failed: %s\n", err.Error())
}
// See if there are already instances for the given cluster
instances, err := provider.GetInstances(createClusterFlags.ClusterInfo)
if err != nil {
Exitf("Failed to query existing instances: %v\n", err)
}
if len(instances) > 0 {
Exitf("Cluster %s.%s already exists.\n", createClusterFlags.Name, createClusterFlags.Domain)
}
// Confirm
if err := confirm(fmt.Sprintf("Are you sure you want to create a %d instance cluster of %s?", createClusterFlags.InstanceCount, createClusterFlags.InstanceConfig)); err != nil {
Exitf("%v\n", err)
}
// Create
err = provider.CreateCluster(log, createClusterFlags, newDnsProvider())
if err != nil {
Exitf("Failed to create new cluster: %v\n", err)
}
// Update all members
reboot := true
if err := providers.UpdateClusterMembers(log, createClusterFlags.ClusterInfo, reboot, nil, provider); err != nil {
Exitf("Failed to update cluster members: %v\n", err)
}
Infof("Cluster created with ID: %s\n", createClusterFlags.ID)
}