Merge pull request #195 from hasheddan/typedrefto

Add TypedReferenceTo meta utility
This commit is contained in:
Daniel Mangum 2020-09-09 11:37:03 -05:00 committed by GitHub
commit c8aaffcea5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 71 additions and 20 deletions

View File

@ -27,14 +27,9 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
)
/*
Prefer taking *corev1.ObjectReference as an argument where possible when
adding new functions to this package. It's easier to convert an object to
an ObjectReference using ReferenceTo() than it is to make an ObjectReference
satisfy metav1.Object.
*/
"github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
)
// AnnotationKeyExternalName is the key in the annotations map of a resource for
// the name of the resource as it appears on provider's systems.
@ -52,6 +47,9 @@ const (
// ReferenceTo returns an object reference to the supplied object, presumed to
// be of the supplied group, version, and kind.
// Deprecated: use a more specific reference type, such as TypedReference or
// Reference instead of the overly verbose ObjectReference.
// See https://github.com/crossplane/crossplane-runtime/issues/49
func ReferenceTo(o metav1.Object, of schema.GroupVersionKind) *corev1.ObjectReference {
v, k := of.ToAPIVersionAndKind()
return &corev1.ObjectReference{
@ -63,8 +61,20 @@ func ReferenceTo(o metav1.Object, of schema.GroupVersionKind) *corev1.ObjectRefe
}
}
// TypedReferenceTo returns a typed object reference to the supplied object,
// presumed to be of the supplied group, version, and kind.
func TypedReferenceTo(o metav1.Object, of schema.GroupVersionKind) *v1alpha1.TypedReference {
v, k := of.ToAPIVersionAndKind()
return &v1alpha1.TypedReference{
APIVersion: v,
Kind: k,
Name: o.GetName(),
UID: o.GetUID(),
}
}
// AsOwner converts the supplied object reference to an owner reference.
func AsOwner(r *corev1.ObjectReference) metav1.OwnerReference {
func AsOwner(r *v1alpha1.TypedReference) metav1.OwnerReference {
return metav1.OwnerReference{
APIVersion: r.APIVersion,
Kind: r.Kind,
@ -75,7 +85,7 @@ func AsOwner(r *corev1.ObjectReference) metav1.OwnerReference {
// AsController converts the supplied object reference to a controller
// reference. You may also consider using metav1.NewControllerRef.
func AsController(r *corev1.ObjectReference) metav1.OwnerReference {
func AsController(r *v1alpha1.TypedReference) metav1.OwnerReference {
c := true
ref := AsOwner(r)
ref.Controller = &c

View File

@ -28,6 +28,7 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
"github.com/crossplane/crossplane-runtime/apis/core/v1alpha1"
"github.com/crossplane/crossplane-runtime/pkg/test"
)
@ -85,16 +86,58 @@ func TestReferenceTo(t *testing.T) {
}
}
func TestTypedReferenceTo(t *testing.T) {
type args struct {
o metav1.Object
of schema.GroupVersionKind
}
tests := map[string]struct {
args
want *v1alpha1.TypedReference
}{
"WithTypeMeta": {
args: args{
o: &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Namespace: namespace,
Name: name,
UID: uid,
},
},
of: schema.GroupVersionKind{
Group: group,
Version: version,
Kind: kind,
},
},
want: &v1alpha1.TypedReference{
APIVersion: groupVersion,
Kind: kind,
Name: name,
UID: uid,
},
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
got := TypedReferenceTo(tc.args.o, tc.args.of)
if diff := cmp.Diff(tc.want, got); diff != "" {
t.Errorf("TypedReferenceTo(): -want, +got:\n%s", diff)
}
})
}
}
func TestAsOwner(t *testing.T) {
tests := map[string]struct {
r *corev1.ObjectReference
r *v1alpha1.TypedReference
want metav1.OwnerReference
}{
"Successful": {
r: &corev1.ObjectReference{
r: &v1alpha1.TypedReference{
APIVersion: groupVersion,
Kind: kind,
Namespace: name,
Name: name,
UID: uid,
},
@ -121,14 +164,13 @@ func TestAsController(t *testing.T) {
controller := true
tests := map[string]struct {
r *corev1.ObjectReference
r *v1alpha1.TypedReference
want metav1.OwnerReference
}{
"Successful": {
r: &corev1.ObjectReference{
r: &v1alpha1.TypedReference{
APIVersion: groupVersion,
Kind: kind,
Namespace: name,
Name: name,
UID: uid,
},

View File

@ -23,7 +23,6 @@ import (
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
@ -77,7 +76,7 @@ func TestResolve(t *testing.T) {
controlled := &fake.Managed{}
controlled.SetName(value)
meta.SetExternalName(controlled, value)
meta.AddControllerReference(controlled, meta.AsController(&corev1.ObjectReference{UID: types.UID("very-unique")}))
meta.AddControllerReference(controlled, meta.AsController(&v1alpha1.TypedReference{UID: types.UID("very-unique")}))
type args struct {
ctx context.Context
@ -268,7 +267,7 @@ func TestResolveMultiple(t *testing.T) {
controlled := &fake.Managed{}
controlled.SetName(value)
meta.SetExternalName(controlled, value)
meta.AddControllerReference(controlled, meta.AsController(&corev1.ObjectReference{UID: types.UID("very-unique")}))
meta.AddControllerReference(controlled, meta.AsController(&v1alpha1.TypedReference{UID: types.UID("very-unique")}))
type args struct {
ctx context.Context

View File

@ -116,7 +116,7 @@ func LocalConnectionSecretFor(o LocalConnectionSecretOwner, kind schema.GroupVer
ObjectMeta: metav1.ObjectMeta{
Namespace: o.GetNamespace(),
Name: o.GetWriteConnectionSecretToReference().Name,
OwnerReferences: []metav1.OwnerReference{meta.AsController(meta.ReferenceTo(o, kind))},
OwnerReferences: []metav1.OwnerReference{meta.AsController(meta.TypedReferenceTo(o, kind))},
},
Type: SecretTypeConnection,
Data: make(map[string][]byte),
@ -141,7 +141,7 @@ func ConnectionSecretFor(o ConnectionSecretOwner, kind schema.GroupVersionKind)
ObjectMeta: metav1.ObjectMeta{
Namespace: o.GetWriteConnectionSecretToReference().Namespace,
Name: o.GetWriteConnectionSecretToReference().Name,
OwnerReferences: []metav1.OwnerReference{meta.AsController(meta.ReferenceTo(o, kind))},
OwnerReferences: []metav1.OwnerReference{meta.AsController(meta.TypedReferenceTo(o, kind))},
},
Type: SecretTypeConnection,
Data: make(map[string][]byte),