-
Notifications
You must be signed in to change notification settings - Fork 0
/
rke_driver.go
149 lines (135 loc) · 3.64 KB
/
rke_driver.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
package rke
import (
"encoding/base64"
"fmt"
"io/ioutil"
"strings"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
generic "github.com/rancher/kontainer-engine/driver"
"github.com/rancher/rke/cmd"
)
// Driver is the struct of rke driver
type Driver struct {
// The string representation of Config Yaml
ConfigYaml string
// Kubernetes master endpoint
Endpoint string
// Root certificates
RootCA string
// Client certificates
ClientCert string
// Client key
ClientKey string
// Cluster info
ClusterInfo generic.ClusterInfo
}
// NewDriver creates a new rke driver
func NewDriver() *Driver {
return &Driver{}
}
// GetDriverCreateOptions returns create flags for rke driver
func (d *Driver) GetDriverCreateOptions() (*generic.DriverFlags, error) {
driverFlag := generic.DriverFlags{
Options: make(map[string]*generic.Flag),
}
driverFlag.Options["config-file-path"] = &generic.Flag{
Type: generic.StringType,
Usage: "the path to the config file",
}
return &driverFlag, nil
}
// GetDriverUpdateOptions returns update flags for rke driver
func (d *Driver) GetDriverUpdateOptions() (*generic.DriverFlags, error) {
driverFlag := generic.DriverFlags{
Options: make(map[string]*generic.Flag),
}
driverFlag.Options["config-file-path"] = &generic.Flag{
Type: generic.StringType,
Usage: "the path to the config file",
}
return &driverFlag, nil
}
// SetDriverOptions sets the drivers options to rke driver
func (d *Driver) SetDriverOptions(driverOptions *generic.DriverOptions) error {
// first look up the file path then look up raw rkeConfig
if path, ok := driverOptions.StringOptions["config-file-path"]; ok {
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
d.ConfigYaml = string(data)
return nil
}
d.ConfigYaml = driverOptions.StringOptions["rkeConfig"]
return nil
}
// Create creates the rke cluster
func (d *Driver) Create() error {
APIURL, caCrt, clientCert, clientKey, err := cmd.ClusterUp(d.ConfigYaml)
if err != nil {
return err
}
d.Endpoint = APIURL
d.RootCA = caCrt
d.ClientCert = clientCert
d.ClientKey = clientKey
return nil
}
// Update updates the rke cluster
func (d *Driver) Update() error {
APIURL, caCrt, clientCert, clientKey, err := cmd.ClusterUp(d.ConfigYaml)
if err != nil {
return err
}
d.Endpoint = APIURL
d.RootCA = caCrt
d.ClientCert = clientCert
d.ClientKey = clientKey
return nil
}
// Get retrieve the cluster info by name
func (d *Driver) Get() (*generic.ClusterInfo, error) {
return &d.ClusterInfo, nil
}
// PostCheck does post action
func (d *Driver) PostCheck() error {
info := &generic.ClusterInfo{}
info.Endpoint = d.Endpoint
info.ClientCertificate = base64.StdEncoding.EncodeToString([]byte(d.ClientCert))
info.ClientKey = base64.StdEncoding.EncodeToString([]byte(d.ClientKey))
info.RootCaCertificate = base64.StdEncoding.EncodeToString([]byte(d.RootCA))
host := d.Endpoint
if !strings.HasPrefix(host, "https://") {
host = fmt.Sprintf("https://%s", host)
}
config := &rest.Config{
Host: host,
TLSClientConfig: rest.TLSClientConfig{
CAData: []byte(d.RootCA),
CertData: []byte(d.ClientCert),
KeyData: []byte(d.ClientKey),
},
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return err
}
serverVersion, err := clientset.DiscoveryClient.ServerVersion()
if err != nil {
return fmt.Errorf("Failed to get Kubernetes server version: %v", err)
}
token, err := generic.GenerateServiceAccountToken(clientset)
if err != nil {
return err
}
info.Version = serverVersion.GitVersion
info.ServiceAccountToken = token
d.ClusterInfo = *info
return nil
}
// Remove removes the cluster
func (d *Driver) Remove() error {
//TODO:
return nil
}