From e88bf9417743abe95c5e25a63d579771d0ac0c2f Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Tue, 14 Dec 2021 11:28:15 +0100 Subject: [PATCH] Add create method in the ingress manager interface (#1152) * Add create method in the ingress manager interface * Remove namespace argument from create method * Update create signature to expect *unstructured.Unstructured instead of runtime.Object * Address review comments/typo Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- pkg/kube/ingress/ingress_extbeta.go | 11 +++++++++++ pkg/kube/ingress/ingress_netbeta.go | 11 +++++++++++ pkg/kube/ingress/ingress_netv1.go | 11 +++++++++++ pkg/kube/ingress/ingressmgr.go | 4 ++++ 4 files changed, 37 insertions(+) diff --git a/pkg/kube/ingress/ingress_extbeta.go b/pkg/kube/ingress/ingress_extbeta.go index 2435a0e888..f34fa1569a 100644 --- a/pkg/kube/ingress/ingress_extbeta.go +++ b/pkg/kube/ingress/ingress_extbeta.go @@ -22,6 +22,7 @@ import ( extensionsv1beta1 "k8s.io/api/extensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" ) @@ -47,6 +48,16 @@ func (i *ExtensionsV1beta1) Get(ctx context.Context, ns, name string) (runtime.O return i.kubeCli.ExtensionsV1beta1().Ingresses(ns).Get(ctx, name, metav1.GetOptions{}) } +// Create can be used to create an ingress resource in extensions v1beta1 apiVersion +func (i *ExtensionsV1beta1) Create(ctx context.Context, ingress *unstructured.Unstructured, opts metav1.CreateOptions) (runtime.Object, error) { + var ing extensionsv1beta1.Ingress + err := runtime.DefaultUnstructuredConverter.FromUnstructured(ingress.UnstructuredContent(), &ing) + if err != nil { + return nil, errors.Wrapf(err, "Failed converting runtime.Object to extensions/v1beta1 ingress") + } + return i.kubeCli.ExtensionsV1beta1().Ingresses(ing.Namespace).Create(ctx, &ing, opts) +} + // IngressPath can be used to get the backend path that is specified in the // ingress resource in `ns` namespace and name `releaseName-ingress` func (i *ExtensionsV1beta1) IngressPath(ctx context.Context, ns, releaseName string) (string, error) { diff --git a/pkg/kube/ingress/ingress_netbeta.go b/pkg/kube/ingress/ingress_netbeta.go index 80135152ed..163abe5dad 100644 --- a/pkg/kube/ingress/ingress_netbeta.go +++ b/pkg/kube/ingress/ingress_netbeta.go @@ -22,6 +22,7 @@ import ( netv1beta1 "k8s.io/api/networking/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" ) @@ -47,6 +48,16 @@ func (i *NetworkingV1beta1) Get(ctx context.Context, ns, name string) (runtime.O return i.kubeCli.NetworkingV1beta1().Ingresses(ns).Get(ctx, name, metav1.GetOptions{}) } +// Create can be used to create an ingress resource in networking v1beta1 apiVersion +func (i *NetworkingV1beta1) Create(ctx context.Context, ingress *unstructured.Unstructured, opts metav1.CreateOptions) (runtime.Object, error) { + var ing netv1beta1.Ingress + err := runtime.DefaultUnstructuredConverter.FromUnstructured(ingress.UnstructuredContent(), &ing) + if err != nil { + return nil, errors.Wrapf(err, "Failed converting runtime.Object to networking/v1beta1 ingress") + } + return i.kubeCli.NetworkingV1beta1().Ingresses(ing.Namespace).Create(ctx, &ing, opts) +} + // IngressPath can be used to get the backend path that is specified in the // ingress resource in `ns` namespace and name `releaseName-ingress` func (i *NetworkingV1beta1) IngressPath(ctx context.Context, ns, releaseName string) (string, error) { diff --git a/pkg/kube/ingress/ingress_netv1.go b/pkg/kube/ingress/ingress_netv1.go index bc66b47287..519777d3c5 100644 --- a/pkg/kube/ingress/ingress_netv1.go +++ b/pkg/kube/ingress/ingress_netv1.go @@ -22,6 +22,7 @@ import ( netv1 "k8s.io/api/networking/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" ) @@ -47,6 +48,16 @@ func (i *NetworkingV1) Get(ctx context.Context, ns, name string) (runtime.Object return i.kubeCli.NetworkingV1().Ingresses(ns).Get(ctx, name, metav1.GetOptions{}) } +// Create can be used to create an ingress resource in networking v1 apiVersion +func (i *NetworkingV1) Create(ctx context.Context, ingress *unstructured.Unstructured, opts metav1.CreateOptions) (runtime.Object, error) { + var ing netv1.Ingress + err := runtime.DefaultUnstructuredConverter.FromUnstructured(ingress.UnstructuredContent(), &ing) + if err != nil { + return nil, errors.Wrapf(err, "Failed converting runtime.Object to networking/v1 ingress") + } + return i.kubeCli.NetworkingV1().Ingresses(ing.Namespace).Create(ctx, &ing, opts) +} + // IngressPath can be used to get the backend path that is specified in the // ingress resource in `ns` namespace and name `releaseName-ingress` func (i *NetworkingV1) IngressPath(ctx context.Context, ns, releaseName string) (string, error) { diff --git a/pkg/kube/ingress/ingressmgr.go b/pkg/kube/ingress/ingressmgr.go index 000dfc89b0..97bda02411 100644 --- a/pkg/kube/ingress/ingressmgr.go +++ b/pkg/kube/ingress/ingressmgr.go @@ -21,6 +21,8 @@ import ( extensionsv1beta1 "k8s.io/api/extensions/v1beta1" netv1 "k8s.io/api/networking/v1" netv1beta1 "k8s.io/api/networking/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" @@ -44,6 +46,8 @@ type Manager interface { // IngressPath can be used to get the backend path that is specified in the // ingress resource in `ns` namespace and name `releaseName-ingress` IngressPath(ctx context.Context, ns, releaseName string) (string, error) + // Create accepts an ingress in as runtime.Object and creates on the cluster + Create(ctx context.Context, ingress *unstructured.Unstructured, opts metav1.CreateOptions) (runtime.Object, error) } // NewManager can be used to get the Manager based on the APIVersion of the ingress resources on the cluster