forked from kubernetes/kops
/
populate_instancegroup_spec.go
134 lines (121 loc) · 3.67 KB
/
populate_instancegroup_spec.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
package cloudup
import (
"fmt"
"github.com/golang/glog"
"k8s.io/kops/upup/pkg/api"
"k8s.io/kops/upup/pkg/fi"
"k8s.io/kops/upup/pkg/fi/utils"
)
const DefaultNodeMachineTypeAWS = "t2.medium"
const DefaultNodeMachineTypeGCE = "n1-standard-2"
const DefaultMasterMachineTypeAWS = "m3.large"
const DefaultMasterMachineTypeGCE = "n1-standard-2"
// PopulateInstanceGroupSpec sets default values in the InstanceGroup
// The InstanceGroup is simpler than the cluster spec, so we just populate in place (like the rest of k8s)
func PopulateInstanceGroupSpec(cluster *api.Cluster, input *api.InstanceGroup) (*api.InstanceGroup, error) {
err := input.Validate(false)
if err != nil {
return nil, err
}
ig := &api.InstanceGroup{}
utils.JsonMergeStruct(ig, input)
if ig.IsMaster() {
if ig.Spec.MachineType == "" {
ig.Spec.MachineType = defaultMasterMachineType(cluster)
}
if ig.Spec.MinSize == nil {
ig.Spec.MinSize = fi.Int(1)
}
if ig.Spec.MaxSize == nil {
ig.Spec.MaxSize = fi.Int(1)
}
} else {
if ig.Spec.MachineType == "" {
ig.Spec.MachineType = defaultNodeMachineType(cluster)
}
if ig.Spec.MinSize == nil {
ig.Spec.MinSize = fi.Int(2)
}
if ig.Spec.MaxSize == nil {
ig.Spec.MaxSize = fi.Int(2)
}
}
if ig.Spec.Image == "" {
ig.Spec.Image = defaultImage(cluster)
}
if ig.IsMaster() {
if len(ig.Spec.Zones) == 0 {
return nil, fmt.Errorf("Master InstanceGroup %s did not specify any Zones", ig.Name)
}
} else {
if len(ig.Spec.Zones) == 0 {
for _, z := range cluster.Spec.Zones {
ig.Spec.Zones = append(ig.Spec.Zones, z.Name)
}
}
}
return ig, nil
}
// defaultNodeMachineType returns the default MachineType for nodes, based on the cloudprovider
func defaultNodeMachineType(cluster *api.Cluster) string {
switch cluster.Spec.CloudProvider {
case "aws":
return DefaultNodeMachineTypeAWS
case "gce":
return DefaultNodeMachineTypeGCE
default:
glog.V(2).Infof("Cannot set default MachineType for CloudProvider=%q", cluster.Spec.CloudProvider)
return ""
}
}
// defaultMasterMachineType returns the default MachineType for masters, based on the cloudprovider
func defaultMasterMachineType(cluster *api.Cluster) string {
// TODO: We used to have logic like the following...
// {{ if gt .TotalNodeCount 500 }}
// MasterMachineType: n1-standard-32
// {{ else if gt .TotalNodeCount 250 }}
//MasterMachineType: n1-standard-16
//{{ else if gt .TotalNodeCount 100 }}
//MasterMachineType: n1-standard-8
//{{ else if gt .TotalNodeCount 10 }}
//MasterMachineType: n1-standard-4
//{{ else if gt .TotalNodeCount 5 }}
//MasterMachineType: n1-standard-2
//{{ else }}
//MasterMachineType: n1-standard-1
//{{ end }}
//
//{{ if gt TotalNodeCount 500 }}
//MasterMachineType: c4.8xlarge
//{{ else if gt TotalNodeCount 250 }}
//MasterMachineType: c4.4xlarge
//{{ else if gt TotalNodeCount 100 }}
//MasterMachineType: m3.2xlarge
//{{ else if gt TotalNodeCount 10 }}
//MasterMachineType: m3.xlarge
//{{ else if gt TotalNodeCount 5 }}
//MasterMachineType: m3.large
//{{ else }}
//MasterMachineType: m3.medium
//{{ end }}
switch cluster.Spec.CloudProvider {
case "aws":
return DefaultMasterMachineTypeAWS
case "gce":
return DefaultMasterMachineTypeGCE
default:
glog.V(2).Infof("Cannot set default MachineType for CloudProvider=%q", cluster.Spec.CloudProvider)
return ""
}
}
// defaultImage returns the default Image, based on the cloudprovider
func defaultImage(cluster *api.Cluster) string {
// TODO: Use spec?
switch cluster.Spec.CloudProvider {
case "aws":
return "282335181503/k8s-1.3-debian-jessie-amd64-hvm-ebs-2016-06-18"
default:
glog.V(2).Infof("Cannot set default Image for CloudProvider=%q", cluster.Spec.CloudProvider)
return ""
}
}