/
felixConfig_storage.go
112 lines (101 loc) · 4.7 KB
/
felixConfig_storage.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
// Copyright (c) 2019 Tigera, Inc. All rights reserved.
package calico
import (
"reflect"
"golang.org/x/net/context"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/registry/generic/registry"
"k8s.io/apiserver/pkg/storage"
etcd "k8s.io/apiserver/pkg/storage/etcd3"
"k8s.io/apiserver/pkg/storage/storagebackend/factory"
aapi "github.com/projectcalico/api/pkg/apis/projectcalico/v3"
api "github.com/projectcalico/api/pkg/apis/projectcalico/v3"
"github.com/projectcalico/libcalico-go/lib/clientv3"
"github.com/projectcalico/libcalico-go/lib/options"
"github.com/projectcalico/libcalico-go/lib/watch"
)
// NewFelixConfigurationStorage creates a new libcalico-based storage.Interface implementation for FelixConfigurations
func NewFelixConfigurationStorage(opts Options) (registry.DryRunnableStorage, factory.DestroyFunc) {
c := CreateClientFromConfig()
createFn := func(ctx context.Context, c clientv3.Interface, obj resourceObject, opts clientOpts) (resourceObject, error) {
oso := opts.(options.SetOptions)
res := obj.(*api.FelixConfiguration)
return c.FelixConfigurations().Create(ctx, res, oso)
}
updateFn := func(ctx context.Context, c clientv3.Interface, obj resourceObject, opts clientOpts) (resourceObject, error) {
oso := opts.(options.SetOptions)
res := obj.(*api.FelixConfiguration)
return c.FelixConfigurations().Update(ctx, res, oso)
}
getFn := func(ctx context.Context, c clientv3.Interface, ns string, name string, opts clientOpts) (resourceObject, error) {
ogo := opts.(options.GetOptions)
return c.FelixConfigurations().Get(ctx, name, ogo)
}
deleteFn := func(ctx context.Context, c clientv3.Interface, ns string, name string, opts clientOpts) (resourceObject, error) {
odo := opts.(options.DeleteOptions)
return c.FelixConfigurations().Delete(ctx, name, odo)
}
listFn := func(ctx context.Context, c clientv3.Interface, opts clientOpts) (resourceListObject, error) {
olo := opts.(options.ListOptions)
return c.FelixConfigurations().List(ctx, olo)
}
watchFn := func(ctx context.Context, c clientv3.Interface, opts clientOpts) (watch.Interface, error) {
olo := opts.(options.ListOptions)
return c.FelixConfigurations().Watch(ctx, olo)
}
dryRunnableStorage := registry.DryRunnableStorage{Storage: &resourceStore{
client: c,
codec: opts.RESTOptions.StorageConfig.Codec,
versioner: etcd.APIObjectVersioner{},
aapiType: reflect.TypeOf(aapi.FelixConfiguration{}),
aapiListType: reflect.TypeOf(aapi.FelixConfigurationList{}),
libCalicoType: reflect.TypeOf(api.FelixConfiguration{}),
libCalicoListType: reflect.TypeOf(api.FelixConfigurationList{}),
isNamespaced: false,
create: createFn,
update: updateFn,
get: getFn,
delete: deleteFn,
list: listFn,
watch: watchFn,
resourceName: "FelixConfiguration",
converter: FelixConfigurationConverter{},
}, Codec: opts.RESTOptions.StorageConfig.Codec}
return dryRunnableStorage, func() {}
}
type FelixConfigurationConverter struct {
}
func (gc FelixConfigurationConverter) convertToLibcalico(aapiObj runtime.Object) resourceObject {
aapiFelixConfig := aapiObj.(*aapi.FelixConfiguration)
lcgFelixConfig := &api.FelixConfiguration{}
lcgFelixConfig.TypeMeta = aapiFelixConfig.TypeMeta
lcgFelixConfig.ObjectMeta = aapiFelixConfig.ObjectMeta
lcgFelixConfig.Kind = api.KindFelixConfiguration
lcgFelixConfig.APIVersion = api.GroupVersionCurrent
lcgFelixConfig.Spec = aapiFelixConfig.Spec
return lcgFelixConfig
}
func (gc FelixConfigurationConverter) convertToAAPI(libcalicoObject resourceObject, aapiObj runtime.Object) {
lcgFelixConfig := libcalicoObject.(*api.FelixConfiguration)
aapiFelixConfig := aapiObj.(*aapi.FelixConfiguration)
aapiFelixConfig.Spec = lcgFelixConfig.Spec
aapiFelixConfig.TypeMeta = lcgFelixConfig.TypeMeta
aapiFelixConfig.ObjectMeta = lcgFelixConfig.ObjectMeta
}
func (gc FelixConfigurationConverter) convertToAAPIList(libcalicoListObject resourceListObject, aapiListObj runtime.Object, pred storage.SelectionPredicate) {
lcgFelixConfigList := libcalicoListObject.(*api.FelixConfigurationList)
aapiFelixConfigList := aapiListObj.(*aapi.FelixConfigurationList)
if libcalicoListObject == nil {
aapiFelixConfigList.Items = []aapi.FelixConfiguration{}
return
}
aapiFelixConfigList.TypeMeta = lcgFelixConfigList.TypeMeta
aapiFelixConfigList.ListMeta = lcgFelixConfigList.ListMeta
for _, item := range lcgFelixConfigList.Items {
aapiFelixConfig := aapi.FelixConfiguration{}
gc.convertToAAPI(&item, &aapiFelixConfig)
if matched, err := pred.Matches(&aapiFelixConfig); err == nil && matched {
aapiFelixConfigList.Items = append(aapiFelixConfigList.Items, aapiFelixConfig)
}
}
}