Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add APIService fake clientset support #3569

Merged
merged 1 commit into from
Oct 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile-proxy
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ RUN (proxy=$(bin/fetch-proxy $(cat proxy-version)) && \
mv "$proxy" linkerd2-proxy)

## compile proxy-identity agent
FROM gcr.io/linkerd-io/go-deps:14d57ed4 as golang
FROM gcr.io/linkerd-io/go-deps:98181d11 as golang
WORKDIR /linkerd-build
COPY pkg/flags pkg/flags
COPY pkg/tls pkg/tls
Expand Down
2 changes: 1 addition & 1 deletion cli/Dockerfile-bin
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## compile binaries
FROM gcr.io/linkerd-io/go-deps:14d57ed4 as golang
FROM gcr.io/linkerd-io/go-deps:98181d11 as golang
WORKDIR /linkerd-build
COPY cli cli
COPY charts charts
Expand Down
2 changes: 1 addition & 1 deletion cni-plugin/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## compile cni-plugin utility
FROM gcr.io/linkerd-io/go-deps:14d57ed4 as golang
FROM gcr.io/linkerd-io/go-deps:98181d11 as golang
WORKDIR /linkerd-build
COPY pkg pkg
COPY controller controller
Expand Down
2 changes: 1 addition & 1 deletion controller/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
## compile controller service
FROM gcr.io/linkerd-io/go-deps:14d57ed4 as golang
FROM gcr.io/linkerd-io/go-deps:98181d11 as golang
WORKDIR /linkerd-build
COPY controller/gen controller/gen
COPY pkg pkg
Expand Down
2 changes: 1 addition & 1 deletion controller/k8s/test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

// NewFakeAPI provides a mock Kubernetes API for testing.
func NewFakeAPI(configs ...string) (*API, error) {
clientSet, _, spClientSet, tsClientSet, err := k8s.NewFakeClientSets(configs...)
clientSet, _, _, spClientSet, tsClientSet, err := k8s.NewFakeClientSets(configs...)
if err != nil {
return nil, err
}
Expand Down
11 changes: 3 additions & 8 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ require (
github.com/briandowns/spinner v0.0.0-20190212173954-5cf08d0ac778
github.com/containernetworking/cni v0.6.0
github.com/coreos/bbolt v1.3.3 // indirect
github.com/coreos/etcd v3.3.13+incompatible // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
Expand All @@ -24,17 +23,14 @@ require (
github.com/evanphx/json-patch v4.2.0+incompatible
github.com/fatih/color v1.7.0
github.com/ghodss/yaml v1.0.0
github.com/go-openapi/jsonpointer v0.17.2 // indirect
github.com/go-openapi/jsonreference v0.17.2 // indirect
github.com/go-openapi/spec v0.17.2
github.com/go-openapi/swag v0.17.2 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect
github.com/golang/protobuf v1.3.2
github.com/google/uuid v1.1.0
github.com/gorilla/websocket v1.2.0
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20160910222444-6b7015e65d36
github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611
github.com/huandu/xstrings v1.2.0 // indirect
github.com/imdario/mergo v0.3.7
github.com/jonboulle/clockwork v0.1.0 // indirect
Expand All @@ -57,7 +53,7 @@ require (
github.com/sergi/go-diff v1.0.0
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
github.com/sirupsen/logrus v1.0.4
github.com/sirupsen/logrus v1.2.0
github.com/soheilhy/cmux v0.1.4 // indirect
github.com/spf13/cobra v0.0.5
github.com/spf13/pflag v1.0.3
Expand All @@ -72,8 +68,6 @@ require (
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297
golang.org/x/tools v0.0.0-20191009213438-b090f1f24028
google.golang.org/grpc v1.22.0
gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect
gopkg.in/go-playground/assert.v1 v1.2.1 // indirect
gopkg.in/go-playground/validator.v8 v8.18.2 // indirect
gopkg.in/tchap/go-patricia.v2 v2.3.0 // indirect
Expand All @@ -83,6 +77,7 @@ require (
k8s.io/client-go v0.0.0-20190620085101-78d2af792bab
k8s.io/helm v2.12.2+incompatible
k8s.io/klog v0.3.2
k8s.io/kube-aggregator v0.0.0-20190620085325-f29e2b4a4f84
sigs.k8s.io/yaml v1.1.0
)

Expand Down
63 changes: 51 additions & 12 deletions go.sum

Large diffs are not rendered by default.

39 changes: 31 additions & 8 deletions pkg/k8s/fake.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,15 @@ import (
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
apiregistrationclient "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
apiregistrationfake "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake"
"sigs.k8s.io/yaml"
)

// NewFakeAPI provides a mock KubernetesAPI backed by hard-coded resources
func NewFakeAPI(configs ...string) (*KubernetesAPI, error) {
client, apiextClient, _, _, err := NewFakeClientSets(configs...)
client, apiextClient, _, _, _, err := NewFakeClientSets(configs...)
if err != nil {
return nil, err
}
Expand All @@ -46,7 +49,7 @@ func NewFakeAPI(configs ...string) (*KubernetesAPI, error) {
// NewFakeAPIFromManifests reads from a slice of readers, each representing a
// manifest or collection of manifests, and returns a mock KubernetesAPI.
func NewFakeAPIFromManifests(readers []io.Reader) (*KubernetesAPI, error) {
client, apiextClient, _, _, err := newFakeClientSetsFromManifests(readers)
client, apiextClient, _, _, _, err := newFakeClientSetsFromManifests(readers)
if err != nil {
return nil, err
}
Expand All @@ -59,20 +62,30 @@ func NewFakeAPIFromManifests(readers []io.Reader) (*KubernetesAPI, error) {

// NewFakeClientSets provides mock Kubernetes ClientSets.
// TODO: make this private once KubernetesAPI (and NewFakeAPI) supports spClient
func NewFakeClientSets(configs ...string) (kubernetes.Interface, apiextensionsclient.Interface, spclient.Interface, tsclient.Interface, error) {
func NewFakeClientSets(configs ...string) (
kubernetes.Interface,
apiextensionsclient.Interface,
apiregistrationclient.Interface,
spclient.Interface,
tsclient.Interface,
error,
) {
objs := []runtime.Object{}
apiextObjs := []runtime.Object{}
apiRegObjs := []runtime.Object{}
discoveryObjs := []runtime.Object{}
spObjs := []runtime.Object{}
tsObjs := []runtime.Object{}
for _, config := range configs {
obj, err := ToRuntimeObject(config)
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, nil, nil, err
}
switch strings.ToLower(obj.GetObjectKind().GroupVersionKind().Kind) {
case "customresourcedefinition":
apiextObjs = append(apiextObjs, obj)
case "apiservice":
apiRegObjs = append(apiRegObjs, obj)
case "apiresourcelist":
discoveryObjs = append(discoveryObjs, obj)
case ServiceProfile:
Expand All @@ -93,6 +106,7 @@ func NewFakeClientSets(configs ...string) (kubernetes.Interface, apiextensionscl

return cs,
apiextensionsfake.NewSimpleClientset(apiextObjs...),
apiregistrationfake.NewSimpleClientset(apiRegObjs...),
spfake.NewSimpleClientset(spObjs...),
tsfake.NewSimpleClientset(tsObjs...),
nil
Expand All @@ -101,7 +115,14 @@ func NewFakeClientSets(configs ...string) (kubernetes.Interface, apiextensionscl
// newFakeClientSetsFromManifests reads from a slice of readers, each
// representing a manifest or collection of manifests, and returns a mock
// Kubernetes ClientSet.
func newFakeClientSetsFromManifests(readers []io.Reader) (kubernetes.Interface, apiextensionsclient.Interface, spclient.Interface, tsclient.Interface, error) {
func newFakeClientSetsFromManifests(readers []io.Reader) (
kubernetes.Interface,
apiextensionsclient.Interface,
apiregistrationclient.Interface,
spclient.Interface,
tsclient.Interface,
error,
) {
configs := []string{}

for _, reader := range readers {
Expand All @@ -115,13 +136,13 @@ func newFakeClientSetsFromManifests(readers []io.Reader) (kubernetes.Interface,
break
}
if err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, nil, nil, err
}

// check for kind
var typeMeta metav1.TypeMeta
if err := yaml.Unmarshal(bytes, &typeMeta); err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, nil, nil, err
}

switch typeMeta.Kind {
Expand All @@ -131,7 +152,7 @@ func newFakeClientSetsFromManifests(readers []io.Reader) (kubernetes.Interface,
case "List":
var sourceList corev1.List
if err := yaml.Unmarshal(bytes, &sourceList); err != nil {
return nil, nil, nil, nil, err
return nil, nil, nil, nil, nil, err
}
for _, item := range sourceList.Items {
configs = append(configs, string(item.Raw))
Expand All @@ -149,6 +170,7 @@ func newFakeClientSetsFromManifests(readers []io.Reader) (kubernetes.Interface,
// ToRuntimeObject deserializes Kubernetes YAML into a Runtime Object
func ToRuntimeObject(config string) (runtime.Object, error) {
apiextensionsv1beta1.AddToScheme(scheme.Scheme)
apiregistrationv1.AddToScheme(scheme.Scheme)
spscheme.AddToScheme(scheme.Scheme)
tsscheme.AddToScheme(scheme.Scheme)
decode := scheme.Codecs.UniversalDeserializer().Decode
Expand All @@ -162,6 +184,7 @@ func ToRuntimeObject(config string) (runtime.Object, error) {
// unregistered.
func ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) {
apiextensionsv1beta1.AddToScheme(scheme.Scheme)
apiregistrationv1.AddToScheme(scheme.Scheme)
spscheme.AddToScheme(scheme.Scheme)
tsscheme.AddToScheme(scheme.Scheme)
return scheme.Scheme.ObjectKinds(obj)
Expand Down
102 changes: 98 additions & 4 deletions pkg/k8s/fake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,23 @@ spec:
kind: FakeCRD
shortNames:
- fc
`,
`, `
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1alpha1.tap.linkerd.io
labels:
linkerd.io/control-plane-component: tap
linkerd.io/control-plane-ns: linkerd
spec:
group: tap.linkerd.io
version: v1alpha1
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: linkerd-tap
namespace: linkerd
caBundle: dGFwIGNydA==`,
}

api, err := NewFakeAPI(k8sConfigs...)
Expand Down Expand Up @@ -94,7 +110,23 @@ spec:
kind: FakeCRD
shortNames:
- fc
`,
`, `
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1alpha1.tap.linkerd.io
labels:
linkerd.io/control-plane-component: tap
linkerd.io/control-plane-ns: linkerd
spec:
group: tap.linkerd.io
version: v1alpha1
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: linkerd-tap
namespace: linkerd
caBundle: dGFwIGNydA==`,
}

readers := []io.Reader{}
Expand Down Expand Up @@ -165,6 +197,27 @@ spec:
},
nil,
},
{
[]string{`
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1alpha1.tap.linkerd.io
labels:
linkerd.io/control-plane-component: tap
linkerd.io/control-plane-ns: linkerd
spec:
group: tap.linkerd.io
version: v1alpha1
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: linkerd-tap
namespace: linkerd
caBundle: dGFwIGNydA==`,
},
nil,
},
{
[]string{""},
runtime.NewMissingKindErr(""),
Expand All @@ -175,7 +228,7 @@ spec:
tc := tc // pin

t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
_, _, _, _, err := NewFakeClientSets(tc.k8sConfigs...)
_, _, _, _, _, err := NewFakeClientSets(tc.k8sConfigs...)
if !reflect.DeepEqual(err, tc.err) {
t.Fatalf("Expected error: %s, Got: %s", tc.err, err)
}
Expand Down Expand Up @@ -238,6 +291,27 @@ items:
},
nil,
},
{
[]string{`
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1alpha1.tap.linkerd.io
labels:
linkerd.io/control-plane-component: tap
linkerd.io/control-plane-ns: linkerd
spec:
group: tap.linkerd.io
version: v1alpha1
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: linkerd-tap
namespace: linkerd
caBundle: dGFwIGNydA==`,
},
nil,
},
{
[]string{"---"},
nil,
Expand All @@ -253,7 +327,7 @@ items:
readers = append(readers, strings.NewReader(m))
}

_, _, _, _, err := newFakeClientSetsFromManifests(readers)
_, _, _, _, _, err := newFakeClientSetsFromManifests(readers)
if !reflect.DeepEqual(err, tc.err) {
t.Fatalf("Expected error: %s, Got: %s", tc.err, err)
}
Expand Down Expand Up @@ -325,6 +399,26 @@ spec:
- fc`,
nil,
},
{
`
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1alpha1.tap.linkerd.io
labels:
linkerd.io/control-plane-component: tap
linkerd.io/control-plane-ns: linkerd
spec:
group: tap.linkerd.io
version: v1alpha1
groupPriorityMinimum: 1000
versionPriority: 100
service:
name: linkerd-tap
namespace: linkerd
caBundle: dGFwIGNydA==`,
nil,
},
}

for i, tc := range testCases {
Expand Down
2 changes: 1 addition & 1 deletion web/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ COPY web/app ./web/app
RUN ./bin/web build

## compile go server
FROM gcr.io/linkerd-io/go-deps:14d57ed4 as golang
FROM gcr.io/linkerd-io/go-deps:98181d11 as golang
WORKDIR /linkerd-build
RUN mkdir -p web
COPY web/main.go web
Expand Down