1
20
21 package kubecli
22
23 import (
24 "flag"
25 "os"
26 "sync"
27
28 routev1 "github.com/openshift/client-go/route/clientset/versioned/typed/route/v1"
29
30 clonev1alpha1 "kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/clone/v1alpha1"
31
32 secv1 "github.com/openshift/client-go/security/clientset/versioned/typed/security/v1"
33 "github.com/spf13/pflag"
34 extclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
35 "k8s.io/apimachinery/pkg/runtime"
36 "k8s.io/apimachinery/pkg/runtime/schema"
37 "k8s.io/apimachinery/pkg/runtime/serializer"
38 "k8s.io/client-go/discovery"
39 "k8s.io/client-go/dynamic"
40 "k8s.io/client-go/kubernetes"
41 "k8s.io/client-go/kubernetes/scheme"
42 "k8s.io/client-go/rest"
43 restclient "k8s.io/client-go/rest"
44 "k8s.io/client-go/tools/clientcmd"
45
46 "kubevirt.io/api/core"
47 v1 "kubevirt.io/api/core/v1"
48 cdiclient "kubevirt.io/client-go/generated/containerized-data-importer/clientset/versioned"
49 k8ssnapshotclient "kubevirt.io/client-go/generated/external-snapshotter/clientset/versioned"
50 generatedclient "kubevirt.io/client-go/generated/kubevirt/clientset/versioned"
51 migrationsv1 "kubevirt.io/client-go/generated/kubevirt/clientset/versioned/typed/migrations/v1alpha1"
52 networkclient "kubevirt.io/client-go/generated/network-attachment-definition-client/clientset/versioned"
53 promclient "kubevirt.io/client-go/generated/prometheus-operator/clientset/versioned"
54 )
55
56 var (
57 kubeconfig string
58 master string
59 )
60
61 var (
62 SchemeBuilder runtime.SchemeBuilder
63 Scheme *runtime.Scheme
64 Codecs serializer.CodecFactory
65 ParameterCodec runtime.ParameterCodec
66 )
67
68 func init() {
69
70
71
72
73
74
75
76 registerVersion := os.Getenv(v1.KubeVirtClientGoSchemeRegistrationVersionEnvVar)
77 if registerVersion != "" {
78 SchemeBuilder = runtime.NewSchemeBuilder(v1.AddKnownTypesGenerator([]schema.GroupVersion{schema.GroupVersion{Group: core.GroupName, Version: registerVersion}}))
79 } else {
80 SchemeBuilder = runtime.NewSchemeBuilder(v1.AddKnownTypesGenerator(v1.GroupVersions))
81 }
82 Scheme = runtime.NewScheme()
83 AddToScheme := SchemeBuilder.AddToScheme
84 Codecs = serializer.NewCodecFactory(Scheme)
85 ParameterCodec = runtime.NewParameterCodec(Scheme)
86 AddToScheme(Scheme)
87 AddToScheme(scheme.Scheme)
88 }
89
90 type RestConfigHookFunc func(*rest.Config)
91
92 var restConfigHooks []RestConfigHookFunc
93 var restConfigHooksLock sync.Mutex
94
95 var virtclient KubevirtClient
96 var once sync.Once
97
98
99
100 func Init() {
101 if flag.CommandLine.Lookup("kubeconfig") == nil {
102 flag.StringVar(&kubeconfig, "kubeconfig", "", "absolute path to the kubeconfig file")
103 }
104 if flag.CommandLine.Lookup("master") == nil {
105 flag.StringVar(&master, "master", "", "master url")
106 }
107 }
108
109 func RegisterRestConfigHook(fn RestConfigHookFunc) {
110 restConfigHooksLock.Lock()
111 defer restConfigHooksLock.Unlock()
112
113 restConfigHooks = append(restConfigHooks, fn)
114 }
115
116 func executeRestConfigHooks(config *rest.Config) {
117 restConfigHooksLock.Lock()
118 defer restConfigHooksLock.Unlock()
119
120 for _, hookFn := range restConfigHooks {
121 hookFn(config)
122 }
123 }
124
125 func FlagSet() *flag.FlagSet {
126 set := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
127 set.StringVar(&kubeconfig, "kubeconfig", "", "absolute path to the kubeconfig file")
128 set.StringVar(&master, "master", "", "master url")
129 return set
130 }
131
132 func GetKubevirtSubresourceClientFromFlags(master string, kubeconfig string) (KubevirtClient, error) {
133 config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
134 if err != nil {
135 return nil, err
136 }
137
138 config.GroupVersion = &v1.SubresourceStorageGroupVersion
139 config.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: Codecs}
140 config.APIPath = "/apis"
141 config.ContentType = runtime.ContentTypeJSON
142
143 restClient, err := rest.RESTClientFor(config)
144 if err != nil {
145 return nil, err
146 }
147
148 coreClient, err := kubernetes.NewForConfig(config)
149 if err != nil {
150 return nil, err
151 }
152
153 generatedKubeVirtClient, err := generatedclient.NewForConfig(config)
154 if err != nil {
155 return nil, err
156 }
157
158 cdiClient, err := cdiclient.NewForConfig(config)
159 if err != nil {
160 return nil, err
161 }
162
163 networkClient, err := networkclient.NewForConfig(config)
164 if err != nil {
165 return nil, err
166 }
167
168 extensionsClient, err := extclient.NewForConfig(config)
169 if err != nil {
170 return nil, err
171 }
172
173 secClient, err := secv1.NewForConfig(config)
174 if err != nil {
175 return nil, err
176 }
177
178 routeClient, err := routev1.NewForConfig(config)
179 if err != nil {
180 return nil, err
181 }
182
183 discoveryClient, err := discovery.NewDiscoveryClientForConfig(config)
184 if err != nil {
185 return nil, err
186 }
187
188 prometheusClient, err := promclient.NewForConfig(config)
189 if err != nil {
190 return nil, err
191 }
192
193 snapshotClient, err := k8ssnapshotclient.NewForConfig(config)
194 if err != nil {
195 return nil, err
196 }
197
198 dynamicClient, err := dynamic.NewForConfig(config)
199 if err != nil {
200 return nil, err
201 }
202
203 migrationsClient, err := migrationsv1.NewForConfig(config)
204 if err != nil {
205 return nil, err
206 }
207
208 cloneClient, err := clonev1alpha1.NewForConfig(config)
209 if err != nil {
210 return nil, err
211 }
212
213 return &kubevirt{
214 master,
215 kubeconfig,
216 restClient,
217 config,
218 generatedKubeVirtClient,
219 cdiClient,
220 networkClient,
221 extensionsClient,
222 secClient,
223 routeClient,
224 discoveryClient,
225 prometheusClient,
226 snapshotClient,
227 dynamicClient,
228 migrationsClient,
229 cloneClient,
230 coreClient,
231 }, nil
232 }
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297 func DefaultClientConfig(flags *pflag.FlagSet) clientcmd.ClientConfig {
298 loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
299
300
301 loadingRules.DefaultClientConfig = &clientcmd.DefaultClientConfig
302
303 flags.StringVar(&loadingRules.ExplicitPath, "kubeconfig", "", "Path to the kubeconfig file to use for CLI requests.")
304
305 overrides := &clientcmd.ConfigOverrides{ClusterDefaults: clientcmd.ClusterDefaults}
306
307 flagNames := clientcmd.RecommendedConfigOverrideFlags("")
308
309 flagNames.ClusterOverrideFlags.APIServer.ShortName = "s"
310
311 clientcmd.BindOverrideFlags(overrides, flags, flagNames)
312 clientConfig := clientcmd.NewInteractiveDeferredLoadingClientConfig(loadingRules, overrides, os.Stdin)
313
314 return clientConfig
315 }
316
317
318 var GetKubevirtClientFromClientConfig = func(cmdConfig clientcmd.ClientConfig) (KubevirtClient, error) {
319 config, err := cmdConfig.ClientConfig()
320 if err != nil {
321 return nil, err
322 }
323 return GetKubevirtClientFromRESTConfig(config)
324
325 }
326
327 func GetKubevirtClientFromRESTConfig(config *rest.Config) (KubevirtClient, error) {
328 shallowCopy := *config
329 shallowCopy.GroupVersion = &v1.StorageGroupVersion
330 shallowCopy.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: Codecs}
331 shallowCopy.APIPath = "/apis"
332 shallowCopy.ContentType = runtime.ContentTypeJSON
333 if config.UserAgent == "" {
334 config.UserAgent = restclient.DefaultKubernetesUserAgent()
335 }
336
337 executeRestConfigHooks(&shallowCopy)
338
339 restClient, err := rest.RESTClientFor(&shallowCopy)
340 if err != nil {
341 return nil, err
342 }
343
344 coreClient, err := kubernetes.NewForConfig(&shallowCopy)
345 if err != nil {
346 return nil, err
347 }
348
349 generatedKubeVirtClient, err := generatedclient.NewForConfig(&shallowCopy)
350 if err != nil {
351 return nil, err
352 }
353
354 cdiClient, err := cdiclient.NewForConfig(&shallowCopy)
355 if err != nil {
356 return nil, err
357 }
358
359 networkClient, err := networkclient.NewForConfig(&shallowCopy)
360 if err != nil {
361 return nil, err
362 }
363
364 extensionsClient, err := extclient.NewForConfig(&shallowCopy)
365 if err != nil {
366 return nil, err
367 }
368
369 secClient, err := secv1.NewForConfig(&shallowCopy)
370 if err != nil {
371 return nil, err
372 }
373
374 routeClient, err := routev1.NewForConfig(&shallowCopy)
375 if err != nil {
376 return nil, err
377 }
378
379 discoveryClient, err := discovery.NewDiscoveryClientForConfig(&shallowCopy)
380 if err != nil {
381 return nil, err
382 }
383
384 prometheusClient, err := promclient.NewForConfig(&shallowCopy)
385 if err != nil {
386 return nil, err
387 }
388
389 snapshotClient, err := k8ssnapshotclient.NewForConfig(&shallowCopy)
390 if err != nil {
391 return nil, err
392 }
393
394 dynamicClient, err := dynamic.NewForConfig(&shallowCopy)
395 if err != nil {
396 return nil, err
397 }
398
399 migrationsClient, err := migrationsv1.NewForConfig(&shallowCopy)
400 if err != nil {
401 return nil, err
402 }
403
404 cloneClient, err := clonev1alpha1.NewForConfig(&shallowCopy)
405 if err != nil {
406 return nil, err
407 }
408
409 return &kubevirt{
410 master,
411 kubeconfig,
412 restClient,
413 &shallowCopy,
414 generatedKubeVirtClient,
415 cdiClient,
416 networkClient,
417 extensionsClient,
418 secClient,
419 routeClient,
420 discoveryClient,
421 prometheusClient,
422 snapshotClient,
423 dynamicClient,
424 migrationsClient,
425 cloneClient,
426 coreClient,
427 }, nil
428 }
429
430 func GetKubevirtClientFromFlags(master string, kubeconfig string) (KubevirtClient, error) {
431 config, err := clientcmd.BuildConfigFromFlags(master, kubeconfig)
432 if err != nil {
433 return nil, err
434 }
435 return GetKubevirtClientFromRESTConfig(config)
436 }
437
438 func GetKubevirtClient() (KubevirtClient, error) {
439 var err error
440 once.Do(func() {
441 virtclient, err = GetKubevirtClientFromFlags(master, kubeconfig)
442 })
443 return virtclient, err
444 }
445
446 func GetKubevirtSubresourceClient() (KubevirtClient, error) {
447 return GetKubevirtSubresourceClientFromFlags(master, kubeconfig)
448 }
449
450
451 func GetConfig() (*restclient.Config, error) {
452 return clientcmd.BuildConfigFromFlags(master, kubeconfig)
453 }
454
455 func GetKubevirtClientConfig() (*rest.Config, error) {
456 return GetConfig()
457 }
458
View as plain text