/
generator.go
170 lines (155 loc) · 3.91 KB
/
generator.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package core
import (
"bytes"
"fmt"
"sigs.k8s.io/yaml"
"strings"
"text/template"
"github.com/currycan/supkube/pkg/logger"
)
var ConfigType string
func setKubeadmAPI(version string) {
major, _ := GetMajorMinorInt(version)
switch {
//
case major < 120:
KubeadmAPI = KubeadmV1beta1
CriSocket = DefaultDockerCRISocket
case major < 123 && major >= 120:
KubeadmAPI = KubeadmV1beta2
CriSocket = DefaultContainerdCRISocket
case major >= 123:
KubeadmAPI = KubeadmV1beta3
CriSocket = DefaultContainerdCRISocket
default:
KubeadmAPI = KubeadmV1beta3
CriSocket = DefaultContainerdCRISocket
}
logger.Debug("KubeadmApi: %s", KubeadmAPI)
logger.Debug("CriSocket: %s", CriSocket)
}
func KubeadmConfig() {
switch ConfigType {
case "kubeadm":
printlnKubeadmConfig()
case "join":
printlnJoinKubeadmConfig()
default:
printlnKubeadmConfig()
}
}
func joinKubeadmConfig() string {
var sb strings.Builder
sb.Write([]byte(JoinCPTemplateText))
return sb.String()
}
func printlnJoinKubeadmConfig() {
fmt.Println(joinKubeadmConfig())
}
func kubeadmConfig() string {
var sb strings.Builder
sb.Write([]byte(InitTemplateText))
return sb.String()
}
func printlnKubeadmConfig() {
fmt.Println(kubeadmConfig())
}
//Template is
func Template() []byte {
return TemplateFromTemplateContent(kubeadmConfig())
}
// JoinTemplate is generate JoinCP nodes configuration by master ip.
func JoinTemplate(ip string, cgroup string) []byte {
return JoinTemplateFromTemplateContent(joinKubeadmConfig(), ip, cgroup)
}
func JoinTemplateFromTemplateContent(templateContent, ip, cgroup string) []byte {
setKubeadmAPI(Version)
tmpl, err := template.New("text").Parse(templateContent)
defer func() {
if r := recover(); r != nil {
logger.Error("join template parse failed:", err)
}
}()
if err != nil {
panic(1)
}
var envMap = make(map[string]interface{})
envMap["Master0"] = IPFormat(MasterIPs[0])
envMap["Master"] = ip
envMap["TokenDiscovery"] = JoinToken
envMap["TokenDiscoveryCAHash"] = TokenCaCertHash
envMap["VIP"] = VIP
envMap["KubeadmApi"] = KubeadmAPI
envMap["CriSocket"] = CriSocket
envMap["CgroupDriver"] = cgroup
var buffer bytes.Buffer
_ = tmpl.Execute(&buffer, envMap)
return buffer.Bytes()
}
func TemplateFromTemplateContent(templateContent string) []byte {
setKubeadmAPI(Version)
tmpl, err := template.New("text").Parse(templateContent)
defer func() {
if r := recover(); r != nil {
logger.Error("template parse failed:", err)
}
}()
if err != nil {
panic(1)
}
var masters []string
getmasters := MasterIPs
for _, h := range getmasters {
masters = append(masters, IPFormat(h))
}
var envMap = make(map[string]interface{})
envMap["CertSANS"] = CertSANS
envMap["VIP"] = VIP
envMap["Masters"] = masters
envMap["Version"] = Version
envMap["ApiServer"] = APIServer
envMap["PodCIDR"] = PodCIDR
envMap["SvcCIDR"] = SvcCIDR
envMap["Repo"] = Repo
envMap["Master0"] = IPFormat(MasterIPs[0])
envMap["Network"] = Network
envMap["CgroupDriver"] = CgroupDriver
envMap["KubeadmApi"] = KubeadmAPI
envMap["CriSocket"] = CriSocket
var buffer bytes.Buffer
_ = tmpl.Execute(&buffer, envMap)
return buffer.Bytes()
}
//根据yaml转换kubeadm结构
func KubeadmDataFromYaml(context string) *KubeadmType {
yamls := strings.Split(context, "---")
if len(yamls) > 0 {
for _, y := range yamls {
cfg := strings.TrimSpace(y)
if cfg == "" {
continue
} else {
kubeadm := &KubeadmType{}
if err := yaml.Unmarshal([]byte(cfg), kubeadm); err == nil {
//
if kubeadm.Kind == "ClusterConfiguration" {
if kubeadm.Networking.DNSDomain == "" {
kubeadm.Networking.DNSDomain = "cluster.local"
}
return kubeadm
}
}
}
}
}
return nil
}
type KubeadmType struct {
Kind string `yaml:"kind,omitempty"`
APIServer struct {
CertSANs []string `yaml:"certSANs,omitempty"`
} `yaml:"apiServer"`
Networking struct {
DNSDomain string `yaml:"dnsDomain,omitempty"`
} `yaml:"networking"`
}