diff --git a/pkg/api/endpoints/testing/make.go b/pkg/api/endpoints/testing/make.go new file mode 100644 index 00000000000..0b397c919bf --- /dev/null +++ b/pkg/api/endpoints/testing/make.go @@ -0,0 +1,70 @@ +/* +Copyright 2021 The Kubernetes Authors. + +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. +*/ + +package testing + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + api "k8s.io/kubernetes/pkg/apis/core" +) + +// Tweak is a function that modifies a Endpoints. +type Tweak func(*api.Endpoints) + +// MakeEndpoints helps construct Endpoints objects (which pass API validation) +// more legibly and tersely than a Go struct definition. +func MakeEndpoints(name string, addrs []api.EndpointAddress, ports []api.EndpointPort, tweaks ...Tweak) *api.Endpoints { + // NOTE: Any field that would be populated by defaulting needs to be + // present and valid here. + eps := &api.Endpoints{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: metav1.NamespaceDefault, + }, + Subsets: []api.EndpointSubset{{ + Addresses: addrs, + Ports: ports, + }}, + } + + for _, tweak := range tweaks { + tweak(eps) + } + + return eps +} + +// MakeEndpointAddress helps construct EndpointAddress objects which pass API +// validation. +func MakeEndpointAddress(ip string, pod string) api.EndpointAddress { + return api.EndpointAddress{ + IP: ip, + TargetRef: &api.ObjectReference{ + Name: pod, + Namespace: metav1.NamespaceDefault, + }, + } +} + +// MakeEndpointPort helps construct EndpointPort objects which pass API +// validation. +func MakeEndpointPort(name string, port int) api.EndpointPort { + return api.EndpointPort{ + Name: name, + Port: int32(port), + } +} diff --git a/pkg/registry/core/service/storage/rest_test.go b/pkg/registry/core/service/storage/rest_test.go index 8aab224460e..fa696749597 100644 --- a/pkg/registry/core/service/storage/rest_test.go +++ b/pkg/registry/core/service/storage/rest_test.go @@ -38,6 +38,7 @@ import ( "k8s.io/apiserver/pkg/util/dryrun" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" + epstest "k8s.io/kubernetes/pkg/api/endpoints/testing" "k8s.io/kubernetes/pkg/api/service" svctest "k8s.io/kubernetes/pkg/api/service/testing" api "k8s.io/kubernetes/pkg/apis/core" @@ -1019,36 +1020,7 @@ func TestServiceRegistryGet(t *testing.T) { } } -func makeEndpoints(name string, addrs []api.EndpointAddress, ports []api.EndpointPort) *api.Endpoints { - return &api.Endpoints{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: metav1.NamespaceDefault, - }, - Subsets: []api.EndpointSubset{{ - Addresses: addrs, - Ports: ports, - }}, - } -} - -func makeEndpointAddress(ip string, pod string) api.EndpointAddress { - return api.EndpointAddress{ - IP: ip, - TargetRef: &api.ObjectReference{ - Name: pod, - Namespace: metav1.NamespaceDefault, - }, - } -} - -func makeEndpointPort(name string, port int) api.EndpointPort { - return api.EndpointPort{ - Name: name, - Port: int32(port), - } -} - +// this is local because it's not fully fleshed out enough for general use. func makePod(name string, ips ...string) api.Pod { p := api.Pod{ ObjectMeta: metav1.ObjectMeta{ @@ -1080,29 +1052,29 @@ func TestServiceRegistryResourceLocation(t *testing.T) { } endpoints := []*api.Endpoints{ - makeEndpoints("unnamed", + epstest.MakeEndpoints("unnamed", []api.EndpointAddress{ - makeEndpointAddress("1.2.3.4", "unnamed"), + epstest.MakeEndpointAddress("1.2.3.4", "unnamed"), }, []api.EndpointPort{ - makeEndpointPort("", 80), + epstest.MakeEndpointPort("", 80), }), - makeEndpoints("unnamed2", + epstest.MakeEndpoints("unnamed2", []api.EndpointAddress{ - makeEndpointAddress("1.2.3.5", "unnamed"), + epstest.MakeEndpointAddress("1.2.3.5", "unnamed"), }, []api.EndpointPort{ - makeEndpointPort("", 80), + epstest.MakeEndpointPort("", 80), }), - makeEndpoints("named", + epstest.MakeEndpoints("named", []api.EndpointAddress{ - makeEndpointAddress("1.2.3.6", "named"), + epstest.MakeEndpointAddress("1.2.3.6", "named"), }, []api.EndpointPort{ - makeEndpointPort("p", 80), - makeEndpointPort("q", 81), + epstest.MakeEndpointPort("p", 80), + epstest.MakeEndpointPort("q", 81), }), - makeEndpoints("no-endpoints", nil, nil), // to prove this does not get chosen + epstest.MakeEndpoints("no-endpoints", nil, nil), // to prove this does not get chosen } storage, _, server := NewTestRESTWithPods(t, endpoints, pods, singleStackIPv4)