Skip to content

Commit 5bd3d01

Browse files
remove apiserver dependency in resourceinterpreter
Signed-off-by: changzhen <[email protected]>
1 parent c9ca6ac commit 5bd3d01

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+231
-9287
lines changed

Diff for: pkg/resourceinterpreter/customized/webhook/customized.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
webhookutil "k8s.io/apiserver/pkg/util/webhook"
3232
corev1 "k8s.io/client-go/listers/core/v1"
3333
"k8s.io/klog/v2"
34-
"k8s.io/kube-aggregator/pkg/apiserver"
3534
utiltrace "k8s.io/utils/trace"
3635

3736
configv1alpha1 "github.com/karmada-io/karmada/pkg/apis/config/v1alpha1"
@@ -70,7 +69,7 @@ func NewCustomizedInterpreter(informer genericmanager.SingleClusterInformerManag
7069
}
7170

7271
cm.SetAuthenticationInfoResolver(authInfoResolver)
73-
cm.SetServiceResolver(apiserver.NewClusterIPServiceResolver(serviceLister))
72+
cm.SetServiceResolver(NewServiceResolver(serviceLister))
7473

7574
return &CustomizedInterpreter{
7675
hookManager: configmanager.NewExploreConfigManager(informer),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package webhook
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"net/url"
7+
8+
corev1 "k8s.io/api/core/v1"
9+
apierrors "k8s.io/apimachinery/pkg/api/errors"
10+
webhookutil "k8s.io/apiserver/pkg/util/webhook"
11+
corev1lister "k8s.io/client-go/listers/core/v1"
12+
)
13+
14+
// ServiceResolver knows how to convert a service reference into an actual location.
15+
type ServiceResolver interface {
16+
ResolveEndpoint(namespace, name string, port int32) (*url.URL, error)
17+
}
18+
19+
// NewServiceResolver returns a ServiceResolver that parses service first,
20+
// if service not exist, constructs a service URL from a given namespace and name.
21+
func NewServiceResolver(services corev1lister.ServiceLister) ServiceResolver {
22+
return &serviceResolver{
23+
services: services,
24+
defaultResolver: webhookutil.NewDefaultServiceResolver(),
25+
}
26+
}
27+
28+
type serviceResolver struct {
29+
services corev1lister.ServiceLister
30+
defaultResolver ServiceResolver
31+
}
32+
33+
func (r *serviceResolver) ResolveEndpoint(namespace, name string, port int32) (*url.URL, error) {
34+
svc, err := r.services.Services(namespace).Get(name)
35+
if err != nil {
36+
if apierrors.IsNotFound(err) {
37+
return r.defaultResolver.ResolveEndpoint(namespace, name, port)
38+
}
39+
return nil, err
40+
}
41+
return resolveCluster(svc, port)
42+
}
43+
44+
// resolveCluster parses Service resource to url.
45+
func resolveCluster(svc *corev1.Service, port int32) (*url.URL, error) {
46+
switch {
47+
case svc.Spec.Type == corev1.ServiceTypeClusterIP && svc.Spec.ClusterIP == corev1.ClusterIPNone:
48+
return nil, fmt.Errorf(`cannot route to service with ClusterIP "None"`)
49+
// use IP from a clusterIP for these service types
50+
case svc.Spec.Type == corev1.ServiceTypeClusterIP, svc.Spec.Type == corev1.ServiceTypeLoadBalancer, svc.Spec.Type == corev1.ServiceTypeNodePort:
51+
svcPort, err := findServicePort(svc, port)
52+
if err != nil {
53+
return nil, err
54+
}
55+
return &url.URL{
56+
Scheme: "https",
57+
Host: net.JoinHostPort(svc.Spec.ClusterIP, fmt.Sprintf("%d", svcPort.Port)),
58+
}, nil
59+
case svc.Spec.Type == corev1.ServiceTypeExternalName:
60+
return &url.URL{
61+
Scheme: "https",
62+
Host: net.JoinHostPort(svc.Spec.ExternalName, fmt.Sprintf("%d", port)),
63+
}, nil
64+
default:
65+
return nil, fmt.Errorf("unsupported service type %q", svc.Spec.Type)
66+
}
67+
}
68+
69+
// findServicePort finds the service port by name or numerically.
70+
func findServicePort(svc *corev1.Service, port int32) (*corev1.ServicePort, error) {
71+
for _, svcPort := range svc.Spec.Ports {
72+
if svcPort.Port == port {
73+
return &svcPort, nil
74+
}
75+
}
76+
return nil, apierrors.NewServiceUnavailable(fmt.Sprintf("no service port %d found for service %q", port, svc.Name))
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
package webhook
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"net/url"
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
corev1 "k8s.io/api/core/v1"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/util/intstr"
13+
)
14+
15+
func Test_resolveCluster(t *testing.T) {
16+
type args struct {
17+
svc *corev1.Service
18+
port int32
19+
}
20+
tests := []struct {
21+
name string
22+
args args
23+
want *url.URL
24+
wantErr assert.ErrorAssertionFunc
25+
}{
26+
{
27+
name: "ClusterIP service without expect port, can not be resolved",
28+
args: args{
29+
svc: &corev1.Service{
30+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
31+
Spec: corev1.ServiceSpec{
32+
Type: corev1.ServiceTypeClusterIP,
33+
ClusterIP: "10.10.10.10",
34+
Ports: []corev1.ServicePort{
35+
{Port: 1234, TargetPort: intstr.FromInt32(1234)},
36+
}}},
37+
port: 443,
38+
},
39+
wantErr: assert.Error,
40+
},
41+
{
42+
name: "ClusterIP service, can be resolved",
43+
args: args{
44+
svc: &corev1.Service{
45+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
46+
Spec: corev1.ServiceSpec{
47+
Type: corev1.ServiceTypeClusterIP,
48+
ClusterIP: "10.10.10.10",
49+
Ports: []corev1.ServicePort{
50+
{Name: "https", Port: 443, TargetPort: intstr.FromInt32(1443)},
51+
{Port: 1234, TargetPort: intstr.FromInt32(1234)},
52+
}}},
53+
port: 443,
54+
},
55+
want: &url.URL{
56+
Scheme: "https",
57+
Host: net.JoinHostPort("10.10.10.10", "443"),
58+
},
59+
wantErr: assert.NoError,
60+
},
61+
{
62+
name: "headless service, can not be resolved",
63+
args: args{
64+
svc: &corev1.Service{
65+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
66+
Spec: corev1.ServiceSpec{
67+
Type: corev1.ServiceTypeClusterIP,
68+
ClusterIP: corev1.ClusterIPNone,
69+
}},
70+
port: 443,
71+
},
72+
wantErr: assert.Error,
73+
},
74+
{
75+
name: "LoadBalancer service, can be resolved",
76+
args: args{
77+
svc: &corev1.Service{
78+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
79+
Spec: corev1.ServiceSpec{
80+
Type: corev1.ServiceTypeLoadBalancer,
81+
ClusterIP: "10.10.10.10",
82+
Ports: []corev1.ServicePort{
83+
{Name: "https", Port: 443, TargetPort: intstr.FromInt32(1443)},
84+
{Port: 1234, TargetPort: intstr.FromInt32(1234)},
85+
}}},
86+
port: 443,
87+
},
88+
want: &url.URL{
89+
Scheme: "https",
90+
Host: net.JoinHostPort("10.10.10.10", "443"),
91+
},
92+
wantErr: assert.NoError,
93+
},
94+
{
95+
name: "NodePort service, can be resolved",
96+
args: args{
97+
svc: &corev1.Service{
98+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
99+
Spec: corev1.ServiceSpec{
100+
Type: corev1.ServiceTypeLoadBalancer,
101+
ClusterIP: "10.10.10.10",
102+
Ports: []corev1.ServicePort{
103+
{Name: "https", Port: 443, TargetPort: intstr.FromInt32(1443)},
104+
{Port: 1234, TargetPort: intstr.FromInt32(1234)},
105+
}}},
106+
port: 443,
107+
},
108+
want: &url.URL{
109+
Scheme: "https",
110+
Host: net.JoinHostPort("10.10.10.10", "443"),
111+
},
112+
wantErr: assert.NoError,
113+
},
114+
{
115+
name: "ExternalName service, can be resolved",
116+
args: args{
117+
svc: &corev1.Service{
118+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
119+
Spec: corev1.ServiceSpec{
120+
Type: corev1.ServiceTypeExternalName,
121+
ExternalName: "foo.bar.com",
122+
}},
123+
port: 443,
124+
},
125+
want: &url.URL{
126+
Scheme: "https",
127+
Host: net.JoinHostPort("foo.bar.com", "443"),
128+
},
129+
wantErr: assert.NoError,
130+
},
131+
{
132+
name: "unsupported type service, can not be resolved",
133+
args: args{
134+
svc: &corev1.Service{
135+
ObjectMeta: metav1.ObjectMeta{Namespace: "one", Name: "alfa"},
136+
Spec: corev1.ServiceSpec{
137+
Type: "unsupported service",
138+
}},
139+
port: 443,
140+
},
141+
wantErr: assert.Error,
142+
},
143+
}
144+
for _, tt := range tests {
145+
t.Run(tt.name, func(t *testing.T) {
146+
got, err := resolveCluster(tt.args.svc, tt.args.port)
147+
if !tt.wantErr(t, err, fmt.Sprintf("resolveCluster(%v, %v)", tt.args.svc, tt.args.port)) {
148+
return
149+
}
150+
assert.Equalf(t, tt.want, got, "resolveCluster(%v, %v)", tt.args.svc, tt.args.port)
151+
})
152+
}
153+
}

Diff for: vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go

-70
This file was deleted.

0 commit comments

Comments
 (0)