-
Notifications
You must be signed in to change notification settings - Fork 474
/
fake.go
167 lines (148 loc) · 6.4 KB
/
fake.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
165
166
167
package kubetest
import (
"context"
osappsfake "github.com/openshift/client-go/apps/clientset/versioned/fake"
osappsscheme "github.com/openshift/client-go/apps/clientset/versioned/scheme"
oauthfake "github.com/openshift/client-go/oauth/clientset/versioned/fake"
oauthscheme "github.com/openshift/client-go/oauth/clientset/versioned/scheme"
projectfake "github.com/openshift/client-go/project/clientset/versioned/fake"
projectscheme "github.com/openshift/client-go/project/clientset/versioned/scheme"
routefake "github.com/openshift/client-go/route/clientset/versioned/fake"
routescheme "github.com/openshift/client-go/route/clientset/versioned/scheme"
userfake "github.com/openshift/client-go/user/clientset/versioned/fake"
userscheme "github.com/openshift/client-go/user/clientset/versioned/scheme"
networking_v1beta1 "istio.io/client-go/pkg/apis/networking/v1beta1"
istio "istio.io/client-go/pkg/clientset/versioned"
istiofake "istio.io/client-go/pkg/clientset/versioned/fake"
istioscheme "istio.io/client-go/pkg/clientset/versioned/scheme"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
kubefake "k8s.io/client-go/kubernetes/fake"
kubescheme "k8s.io/client-go/kubernetes/scheme"
gatewayapi "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned"
gatewayapifake "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/fake"
gatewayapischeme "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned/scheme"
kialikube "github.com/kiali/kiali/kubernetes"
)
func isIstioResource(obj runtime.Object) bool {
_, _, err := istioscheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isKubeResource(obj runtime.Object) bool {
_, _, err := kubescheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isGatewayAPIResource(obj runtime.Object) bool {
_, _, err := gatewayapischeme.Scheme.ObjectKinds(obj)
return err == nil
}
func isProjectResource(obj runtime.Object) bool {
_, _, err := projectscheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isRouteResource(obj runtime.Object) bool {
_, _, err := routescheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isOSAppsResource(obj runtime.Object) bool {
_, _, err := osappsscheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isUserResource(obj runtime.Object) bool {
_, _, err := userscheme.Scheme.ObjectKinds(obj)
return err == nil
}
func isOAuthResource(obj runtime.Object) bool {
_, _, err := oauthscheme.Scheme.ObjectKinds(obj)
return err == nil
}
// NewFakeK8sClient creates a new fake kubernetes client for testing purposes.
func NewFakeK8sClient(objects ...runtime.Object) *FakeK8sClient {
// NOTE: The kube fake client object tracker guesses the resource name based on the Kind.
// For a plural resource, it will convert the kind to lowercase and add an "ies" to the end.
// In the case of objects like "Gateway" where the plural is actually "Gateways", the conversion
// is wrong. The guessing of the resource name only happens with tracker.Add inside of NewSimpleClientset.
// If we create the object after creating the clientset, then the tracker will use the correct resource name.
var (
kubeObjects []runtime.Object
istioObjects []runtime.Object
gatewayapiObjects []runtime.Object
osAppsObjects []runtime.Object
routeObjects []runtime.Object
projectObjects []runtime.Object
userObjects []runtime.Object
oAuthObjects []runtime.Object
istioGateways []*networking_v1beta1.Gateway
)
for _, obj := range objects {
o := obj
switch {
case isKubeResource(o):
kubeObjects = append(kubeObjects, o)
case isIstioResource(o):
if gw, ok := o.(*networking_v1beta1.Gateway); ok {
istioGateways = append(istioGateways, gw)
} else {
istioObjects = append(istioObjects, o)
}
case isGatewayAPIResource(o):
gatewayapiObjects = append(gatewayapiObjects, o)
case isOSAppsResource(o):
osAppsObjects = append(osAppsObjects, o)
case isRouteResource(o):
routeObjects = append(routeObjects, o)
case isProjectResource(o):
projectObjects = append(projectObjects, o)
case isUserResource(o):
userObjects = append(userObjects, o)
case isOAuthResource(o):
oAuthObjects = append(oAuthObjects, o)
}
}
kubeClient := kubefake.NewSimpleClientset(kubeObjects...)
istioClient := istiofake.NewSimpleClientset(istioObjects...)
gatewayAPIClient := gatewayapifake.NewSimpleClientset(gatewayapiObjects...)
osAppsClient := osappsfake.NewSimpleClientset(osAppsObjects...)
projectClient := projectfake.NewSimpleClientset(projectObjects...)
routeClient := routefake.NewSimpleClientset(routeObjects...)
userClient := userfake.NewSimpleClientset(userObjects...)
oAuthClient := oauthfake.NewSimpleClientset(oAuthObjects...)
// These are created separately because the fake clientset guesses the resource name based on the Kind.
for _, gw := range istioGateways {
if _, err := istioClient.NetworkingV1beta1().Gateways(gw.Namespace).Create(context.TODO(), gw, metav1.CreateOptions{}); err != nil {
panic(err)
}
}
return &FakeK8sClient{
ClientInterface: kialikube.NewClient(kubeClient, istioClient, gatewayAPIClient, osAppsClient, projectClient, routeClient, userClient, oAuthClient),
KubeClientset: kubeClient,
IstioClientset: istioClient,
ProjectFake: projectClient,
IstioAPIEnabled: true,
}
}
// FakeK8sClient is an implementation of the kiali Kubernetes client interface used for tests.
type FakeK8sClient struct {
OpenShift bool
GatewayAPIEnabled bool
IstioAPIEnabled bool
kialikube.ClientInterface
// Underlying kubernetes clientset.
KubeClientset kubernetes.Interface
// Underlying istio clientset.
IstioClientset istio.Interface
// Underlying gateway api clientset.
GatewayAPIClientset gatewayapi.Interface
// Token is the kiali token this client uses.
Token string
KubeClusterInfo kialikube.ClusterInfo
ProjectFake *projectfake.Clientset
}
func (c *FakeK8sClient) IsOpenShift() bool { return c.OpenShift }
func (c *FakeK8sClient) IsExpGatewayAPI() bool { return c.GatewayAPIEnabled }
func (c *FakeK8sClient) IsGatewayAPI() bool { return c.GatewayAPIEnabled }
func (c *FakeK8sClient) IsIstioAPI() bool { return c.IstioAPIEnabled }
func (c *FakeK8sClient) GetToken() string { return c.Token }
func (c *FakeK8sClient) ClusterInfo() kialikube.ClusterInfo { return c.KubeClusterInfo }
var _ kialikube.ClientInterface = &FakeK8sClient{}