This repository has been archived by the owner on May 11, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 17
/
genericClient.go
131 lines (111 loc) · 3.78 KB
/
genericClient.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
//
// Copyright (c) 2018 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// SPDX-License-Identifier: EPL-2.0
//
package resource
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"encoding/json"
"github.com/IntelAI/vck/pkg/resource/reify"
"github.com/golang/glog"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/dynamic"
)
type genericClient struct {
resource dynamic.ResourceInterface
resourcePluralForm string
namespace string
templateFileName string
scheme *runtime.Scheme
groupversion runtime.GroupVersioner
reify reify.ReifyInterface
}
// NewGenericClient returns a new horizontal pod autoscaler client.
func NewGenericClient(resource dynamic.ResourceInterface, templateFileName string, resourcePluralForm string, scheme *runtime.Scheme, groupversion runtime.GroupVersioner, reify reify.ReifyInterface) Client {
return &genericClient{
resource: resource,
resourcePluralForm: resourcePluralForm,
templateFileName: templateFileName,
scheme: scheme,
groupversion: groupversion,
reify: reify,
}
}
func (c *genericClient) Reify(templateValues interface{}) ([]byte, error) {
result, err := c.reify.Reify(c.templateFileName, templateValues)
if err != nil {
return nil, err
}
return result, nil
}
func (c *genericClient) Create(namespace string, templateValues interface{}) error {
resourceBody, err := c.Reify(templateValues)
if err != nil {
return err
}
// Create an unstructured object from the reified template so that it can be passed to the client.
object := &unstructured.Unstructured{}
err = json.Unmarshal(resourceBody, object)
if err != nil {
return err
}
_, err = c.resource.Create(object)
if err != nil {
return err
}
return nil
}
func (c *genericClient) Delete(namespace, name string) error {
return c.resource.Delete(name, &metav1.DeleteOptions{})
}
func (c *genericClient) Get(namespace, name string) (result runtime.Object, err error) {
res, err := c.resource.Get(name, metav1.GetOptions{})
result, err = c.scheme.ConvertToVersion(res, c.groupversion)
if err != nil {
return nil, err
}
return
}
func (c *genericClient) List(namespace string, labels map[string]string) (result []metav1.Object, err error) {
opts := metav1.ListOptions{}
list, err := c.resource.List(opts)
if err != nil {
glog.Infof("[generic_client] Got err while listing: %v", err)
return []metav1.Object{}, err
}
object := list.(*unstructured.UnstructuredList)
for _, item := range object.Items {
// We need a copy of the item here because item has function scope whereas the copy below has a local scope.
// Ex: When we iterate through items, the result list will only contain multiple copies of the last item in the list.
itemCopy := item
result = append(result, &itemCopy)
}
return
}
// Plural returns the plural form of the resource.
func (c *genericClient) Plural() string {
return c.resourcePluralForm
}
func (c *genericClient) Update(object runtime.Object) (result runtime.Object, err error) {
convertedObject := &unstructured.Unstructured{}
err = c.scheme.Convert(object, convertedObject, c.resource)
if err != nil {
return
}
result, err = c.resource.Update(convertedObject)
return
}