Remove BPA from Makefile
[icn.git] / cmd / bpa-operator / vendor / github.com / operator-framework / operator-sdk / pkg / kube-metrics / uclient.go
1 // Copyright 2019 The Operator-SDK Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package kubemetrics
16
17 import (
18         "fmt"
19
20         "github.com/pkg/errors"
21         metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22         "k8s.io/apimachinery/pkg/runtime/schema"
23         "k8s.io/apimachinery/pkg/runtime/serializer"
24         "k8s.io/client-go/dynamic"
25         "k8s.io/client-go/kubernetes"
26         "k8s.io/client-go/kubernetes/scheme"
27         "k8s.io/client-go/rest"
28 )
29
30 func newClientForGVK(cfg *rest.Config, apiVersion, kind string) (dynamic.NamespaceableResourceInterface, error) {
31         apiResourceList, apiResource, err := getAPIResource(cfg, apiVersion, kind)
32         if err != nil {
33                 return nil, errors.Wrapf(err, "discovering resource information failed for %s in %s", kind, apiVersion)
34         }
35
36         dc, err := newForConfig(cfg, apiResourceList.GroupVersion)
37         if err != nil {
38                 return nil, errors.Wrapf(err, "creating dynamic client failed for %s", apiResourceList.GroupVersion)
39         }
40
41         gv, err := schema.ParseGroupVersion(apiResourceList.GroupVersion)
42         if err != nil {
43                 return nil, errors.Wrapf(err, "parsing GroupVersion %s failed", apiResourceList.GroupVersion)
44         }
45
46         gvr := schema.GroupVersionResource{
47                 Group:    gv.Group,
48                 Version:  gv.Version,
49                 Resource: apiResource.Name,
50         }
51
52         return dc.Resource(gvr), nil
53 }
54
55 func getAPIResource(cfg *rest.Config, apiVersion, kind string) (*metav1.APIResourceList, *metav1.APIResource, error) {
56         kclient, err := kubernetes.NewForConfig(cfg)
57         if err != nil {
58                 return nil, nil, err
59         }
60
61         apiResourceLists, err := kclient.Discovery().ServerResources()
62         if err != nil {
63                 return nil, nil, err
64         }
65
66         for _, apiResourceList := range apiResourceLists {
67                 if apiResourceList.GroupVersion == apiVersion {
68                         for _, r := range apiResourceList.APIResources {
69                                 if r.Kind == kind {
70                                         return apiResourceList, &r, nil
71                                 }
72                         }
73                 }
74         }
75
76         return nil, nil, fmt.Errorf("apiVersion %s and kind %s not found available in Kubernetes cluster", apiVersion, kind)
77 }
78
79 func newForConfig(c *rest.Config, groupVersion string) (dynamic.Interface, error) {
80         config := rest.CopyConfig(c)
81
82         err := setConfigDefaults(groupVersion, config)
83         if err != nil {
84                 return nil, err
85         }
86
87         return dynamic.NewForConfig(config)
88 }
89
90 func setConfigDefaults(groupVersion string, config *rest.Config) error {
91         gv, err := schema.ParseGroupVersion(groupVersion)
92         if err != nil {
93                 return err
94         }
95         config.GroupVersion = &gv
96         config.APIPath = "/apis"
97         if config.GroupVersion.Group == "" && config.GroupVersion.Version == "v1" {
98                 config.APIPath = "/api"
99         }
100         config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}
101         return nil
102 }