use istio client-go library instead of knative (#1661)

use istio client-go library instead of knative
bump kubernetes dependency version
change code coverage to codecov
This commit is contained in:
zryfish
2019-12-13 11:26:18 +08:00
committed by GitHub
parent f249a6e081
commit ea88c8803d
2071 changed files with 354531 additions and 108336 deletions

View File

@@ -22,7 +22,8 @@ import (
"reflect"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -33,15 +34,15 @@ import (
// a controller reference is already owned by another controller Object is the
// subject and Owner is the reference for the current owner
type AlreadyOwnedError struct {
Object v1.Object
Owner v1.OwnerReference
Object metav1.Object
Owner metav1.OwnerReference
}
func (e *AlreadyOwnedError) Error() string {
return fmt.Sprintf("Object %s/%s is already owned by another %s controller %s", e.Object.GetNamespace(), e.Object.GetName(), e.Owner.Kind, e.Owner.Name)
}
func newAlreadyOwnedError(Object v1.Object, Owner v1.OwnerReference) *AlreadyOwnedError {
func newAlreadyOwnedError(Object metav1.Object, Owner metav1.OwnerReference) *AlreadyOwnedError {
return &AlreadyOwnedError{
Object: Object,
Owner: Owner,
@@ -53,10 +54,21 @@ func newAlreadyOwnedError(Object v1.Object, Owner v1.OwnerReference) *AlreadyOwn
// reconciling the owner object on changes to owned (with a Watch + EnqueueRequestForOwner).
// Since only one OwnerReference can be a controller, it returns an error if
// there is another OwnerReference with Controller flag set.
func SetControllerReference(owner, object v1.Object, scheme *runtime.Scheme) error {
func SetControllerReference(owner, object metav1.Object, scheme *runtime.Scheme) error {
ro, ok := owner.(runtime.Object)
if !ok {
return fmt.Errorf("is not a %T a runtime.Object, cannot call SetControllerReference", owner)
return fmt.Errorf("%T is not a runtime.Object, cannot call SetControllerReference", owner)
}
ownerNs := owner.GetNamespace()
if ownerNs != "" {
objNs := object.GetNamespace()
if objNs == "" {
return fmt.Errorf("cluster-scoped resource must not have a namespace-scoped owner, owner's namespace %s", ownerNs)
}
if ownerNs != objNs {
return fmt.Errorf("cross-namespace owner references are disallowed, owner's namespace %s, obj's namespace %s", owner.GetNamespace(), object.GetNamespace())
}
}
gvk, err := apiutil.GVKForObject(ro, scheme)
@@ -65,7 +77,7 @@ func SetControllerReference(owner, object v1.Object, scheme *runtime.Scheme) err
}
// Create a new ref
ref := *v1.NewControllerRef(owner, schema.GroupVersionKind{Group: gvk.Group, Version: gvk.Version, Kind: gvk.Kind})
ref := *metav1.NewControllerRef(owner, schema.GroupVersionKind{Group: gvk.Group, Version: gvk.Version, Kind: gvk.Kind})
existingRefs := object.GetOwnerReferences()
fi := -1
@@ -88,7 +100,7 @@ func SetControllerReference(owner, object v1.Object, scheme *runtime.Scheme) err
}
// Returns true if a and b point to the same object
func referSameObject(a, b v1.OwnerReference) bool {
func referSameObject(a, b metav1.OwnerReference) bool {
aGV, err := schema.ParseGroupVersion(a.APIVersion)
if err != nil {
return false
@@ -114,65 +126,101 @@ const ( // They should complete the sentence "Deployment default/foo has been ..
OperationResultUpdated OperationResult = "updated"
)
// CreateOrUpdate creates or updates the given object obj in the Kubernetes
// cluster. The object's desired state should be reconciled with the existing
// state using the passed in ReconcileFn. obj must be a struct pointer so that
// obj can be updated with the content returned by the Server.
// CreateOrUpdate creates or updates the given object in the Kubernetes
// cluster. The object's desired state must be reconciled with the existing
// state inside the passed in callback MutateFn.
//
// The MutateFn is called regardless of creating or updating an object.
//
// It returns the executed operation and an error.
func CreateOrUpdate(ctx context.Context, c client.Client, obj runtime.Object, f MutateFn) (OperationResult, error) {
// op is the operation we are going to attempt
op := OperationResultNone
// get the existing object meta
metaObj, ok := obj.(v1.Object)
if !ok {
return OperationResultNone, fmt.Errorf("%T does not implement metav1.Object interface", obj)
}
// retrieve the existing object
key := client.ObjectKey{
Name: metaObj.GetName(),
Namespace: metaObj.GetNamespace(),
}
err := c.Get(ctx, key, obj)
// reconcile the existing object
existing := obj.DeepCopyObject()
existingObjMeta := existing.(v1.Object)
existingObjMeta.SetName(metaObj.GetName())
existingObjMeta.SetNamespace(metaObj.GetNamespace())
if e := f(obj); e != nil {
return OperationResultNone, e
}
if metaObj.GetName() != existingObjMeta.GetName() {
return OperationResultNone, fmt.Errorf("ReconcileFn cannot mutate objects name")
}
if metaObj.GetNamespace() != existingObjMeta.GetNamespace() {
return OperationResultNone, fmt.Errorf("ReconcileFn cannot mutate objects namespace")
}
if errors.IsNotFound(err) {
err = c.Create(ctx, obj)
op = OperationResultCreated
} else if err == nil {
if reflect.DeepEqual(existing, obj) {
return OperationResultNone, nil
}
err = c.Update(ctx, obj)
op = OperationResultUpdated
} else {
key, err := client.ObjectKeyFromObject(obj)
if err != nil {
return OperationResultNone, err
}
if err != nil {
op = OperationResultNone
if err := c.Get(ctx, key, obj); err != nil {
if !errors.IsNotFound(err) {
return OperationResultNone, err
}
if err := mutate(f, key, obj); err != nil {
return OperationResultNone, err
}
if err := c.Create(ctx, obj); err != nil {
return OperationResultNone, err
}
return OperationResultCreated, nil
}
return op, err
existing := obj.DeepCopyObject()
if err := mutate(f, key, obj); err != nil {
return OperationResultNone, err
}
if reflect.DeepEqual(existing, obj) {
return OperationResultNone, nil
}
if err := c.Update(ctx, obj); err != nil {
return OperationResultNone, err
}
return OperationResultUpdated, nil
}
// mutate wraps a MutateFn and applies validation to its result
func mutate(f MutateFn, key client.ObjectKey, obj runtime.Object) error {
if err := f(); err != nil {
return err
}
if newKey, err := client.ObjectKeyFromObject(obj); err != nil || key != newKey {
return fmt.Errorf("MutateFn cannot mutate object name and/or object namespace")
}
return nil
}
// MutateFn is a function which mutates the existing object into it's desired state.
type MutateFn func(existing runtime.Object) error
type MutateFn func() error
// AddFinalizer accepts a metav1 object and adds the provided finalizer if not present.
func AddFinalizer(o metav1.Object, finalizer string) {
f := o.GetFinalizers()
for _, e := range f {
if e == finalizer {
return
}
}
o.SetFinalizers(append(f, finalizer))
}
// AddFinalizerWithError tries to convert a runtime object to a metav1 object and add the provided finalizer.
// It returns an error if the provided object cannot provide an accessor.
func AddFinalizerWithError(o runtime.Object, finalizer string) error {
m, err := meta.Accessor(o)
if err != nil {
return err
}
AddFinalizer(m, finalizer)
return nil
}
// RemoveFinalizer accepts a metav1 object and removes the provided finalizer if present.
func RemoveFinalizer(o metav1.Object, finalizer string) {
f := o.GetFinalizers()
for i, e := range f {
if e == finalizer {
f = append(f[:i], f[i+1:]...)
}
}
o.SetFinalizers(f)
}
// RemoveFinalizerWithError tries to convert a runtime object to a metav1 object and remove the provided finalizer.
// It returns an error if the provided object cannot provide an accessor.
func RemoveFinalizerWithError(o runtime.Object, finalizer string) error {
m, err := meta.Accessor(o)
if err != nil {
return err
}
RemoveFinalizer(m, finalizer)
return nil
}