/
initclient.go
164 lines (137 loc) · 4.2 KB
/
initclient.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
package api
import (
"fmt"
"io/ioutil"
"os"
"runtime"
migv1alpha1 "github.com/fusor/mig-controller/pkg/apis/migration/v1alpha1"
"github.com/mitchellh/go-homedir"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"k8s.io/apimachinery/pkg/api/meta"
k8sruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
"sigs.k8s.io/controller-runtime/pkg/client"
)
var (
// KubeConfig represents kubeconfig
KubeConfig *clientcmdapi.Config
// SrcRESTMapper is Source REST Mapper
SrcRESTMapper meta.RESTMapper
// DstRESTMapper is destination REST Mapper
DstRESTMapper meta.RESTMapper
// ClusterNames contains names of contexts and cluster
ClusterNames = make(map[string]string)
// CtrlClient k8s controller client for migration cluster
CtrlClient client.Client
// K8sSrcClient k8s api client for source cluster
K8sSrcClient *kubernetes.Clientset
// K8sSrcDynClient k8s api client for source cluster
K8sSrcDynClient dynamic.Interface
// K8sDstClient k8s api client for target cluster
K8sDstClient *kubernetes.Clientset
kubeConfigGetter = func() (*clientcmdapi.Config, error) {
return KubeConfig, nil
}
)
// ParseKubeConfig parse kubeconfig
func ParseKubeConfig() error {
kubeConfigPath, err := getKubeConfigPath()
if err != nil {
return err
}
kubeConfigFile, err := ioutil.ReadFile(kubeConfigPath)
if err != nil {
return err
}
KubeConfig, err = clientcmd.Load(kubeConfigFile)
if err != nil {
return err
}
// Map context clusters and name for easier access in future
for name, context := range KubeConfig.Contexts {
ClusterNames[context.Cluster] = name
}
return nil
}
func getKubeConfigPath() (string, error) {
// Get kubeconfig using $KUBECONFIG, if not try ~/.kube/config
var kubeConfigPath string
kubeconfigEnv := os.Getenv("KUBECONFIG")
if kubeconfigEnv != "" {
kubeConfigPath = kubeconfigEnv
} else {
home, err := homedir.Dir()
if err != nil {
return "", errors.Wrap(err, "Can't detect home user directory")
}
kubeConfigPath = fmt.Sprintf("%s/.kube/config", home)
}
return kubeConfigPath, nil
}
// CreateCtrlClient creates a k8s runtime-controller client for given context
func CreateCtrlClient(contextCluster string) error {
if CtrlClient == nil {
config, err := buildConfig(contextCluster)
if err != nil {
return err
}
crScheme := k8sruntime.NewScheme()
migv1alpha1.AddToScheme(crScheme)
CtrlClient = NewCtrlClientorDie(config, client.Options{Scheme: crScheme})
logrus.Debugf("Kubernetes Controller client initialized for %s", contextCluster)
}
return nil
}
// CreateK8sDstClient create api client using cluster from kubeconfig context
func CreateK8sDstClient(contextCluster string) error {
if K8sDstClient == nil {
config, err := buildConfig(contextCluster)
if err != nil {
return err
}
K8sDstClient = NewK8SOrDie(config)
logrus.Debugf("Kubernetes API client initialized for %s", contextCluster)
}
return nil
}
// CreateK8sSrcClient create api client using cluster from kubeconfig context
func CreateK8sSrcClient(contextCluster string) error {
if K8sSrcClient == nil {
config, err := buildConfig(contextCluster)
if err != nil {
return err
}
K8sSrcClient = NewK8SOrDie(config)
logrus.Debugf("Kubernetes API client initialized for %s", contextCluster)
}
return nil
}
// CreateK8sSrcDynClient create api client using cluster from kubeconfig context
func CreateK8sSrcDynClient(contextCluster string) error {
if K8sSrcDynClient == nil {
config, err := buildConfig(contextCluster)
if err != nil {
return err
}
K8sSrcDynClient = NewK8SDynClientOrDie(config)
logrus.Debugf("Kubernetes API dynamic client initialized for %s", contextCluster)
}
return nil
}
func buildConfig(contextCluster string) (*rest.Config, error) {
config, err := clientcmd.BuildConfigFromKubeconfigGetter("", kubeConfigGetter)
if err != nil {
return nil, errors.Wrap(err, "Error in KUBECONFIG")
}
config.AcceptContentTypes = "application/vnd.kubernetes.protobuf,application/json"
config.UserAgent = fmt.Sprintf(
"cpma/v1.0 (%s/%s) kubernetes/v1.0",
runtime.GOOS, runtime.GOARCH,
)
return config, nil
}