Files
odo/pkg/kclient/ingress.go
Philippe Martin 850c7cd723 Remove commands that wont be implemented for v3-alpha1 (#5433)
* Remove odo staorage commands

* Remove "odo service" + "odo catalog * service" commands

* Remove odo link/unlink commands

* Remove related integration tests

* Remove application concept

* fix rebase

* fix test

* Remove config command

* Remove env command

* Remove application package

* Remove config package

* Move odogenerator and unions packages into kclient

* Move notify package to cli/version

* Fix script mockgen

* Remove odo debug command oand debug package

* Remove odo component describe/exec/log/status/test

* Remove operator-hub tests from IBM tests

* Remove operator hub tests from CI

* Fix e2e tests
2022-02-06 23:42:15 -05:00

148 lines
5.4 KiB
Go

package kclient
import (
"context"
"fmt"
"github.com/redhat-developer/odo/pkg/kclient/unions"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// GetOneIngressFromSelector gets one ingress with the given selector
// if no or multiple ingresses are found with the given selector, it throws an error
func (c *Client) GetOneIngressFromSelector(selector string) (*unions.KubernetesIngress, error) {
ingresses, err := c.ListIngresses(selector)
if err != nil {
return nil, err
}
if num := len(ingresses.Items); num == 0 {
return nil, fmt.Errorf("no ingress was found for the selector: %v", selector)
} else if num > 1 {
return nil, fmt.Errorf("multiple ingresses exist for the selector: %v. Only one must be present", selector)
}
return ingresses.Items[0], nil
}
//CreateIngress creates a specified Kubernetes Ingress as a networking v1 or extensions v1beta1 ingress depending on what
//is supported, with preference for networking v1 ingress. The passed ingress MUST be a generated one, i.e it must
//have been created using unions.NewKubernetesIngressFromParams
func (c *Client) CreateIngress(ingress unions.KubernetesIngress) (*unions.KubernetesIngress, error) {
var err error
if !ingress.IsGenerated() {
return nil, fmt.Errorf("create ingress should get a generated ingress. If you are hiting this, contact the developer")
}
if ingress.GetName() == "" {
return nil, fmt.Errorf("cannot create an ingress without a name")
}
err = c.checkIngressSupport()
if err != nil {
return nil, err
}
created := false
kubernetesIngress := unions.NewNonGeneratedKubernetesIngress()
if c.isNetworkingV1IngressSupported {
kubernetesIngress.NetworkingV1Ingress, err = c.KubeClient.NetworkingV1().Ingresses(c.Namespace).Create(context.TODO(), ingress.NetworkingV1Ingress, metav1.CreateOptions{})
if err != nil {
return nil, fmt.Errorf("failed to create networking v1 ingress %w", err)
}
created = true
} else if c.isExtensionV1Beta1IngressSupported {
kubernetesIngress.ExtensionV1Beta1Ingress, err = c.KubeClient.ExtensionsV1beta1().Ingresses(c.Namespace).Create(context.TODO(), ingress.ExtensionV1Beta1Ingress, metav1.CreateOptions{})
if err != nil {
return nil, fmt.Errorf("failed to create extension v1 beta 1 ingress %w", err)
}
created = true
}
if !created {
return nil, fmt.Errorf("failed to create ingress as none of the options are supported")
}
return kubernetesIngress, nil
}
func (c *Client) DeleteIngress(name string) error {
var err error
err = c.checkIngressSupport()
if err != nil {
return err
}
if c.isNetworkingV1IngressSupported {
err = c.KubeClient.NetworkingV1().Ingresses(c.Namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
if err != nil {
return fmt.Errorf("failed to delete networking v1 ingress %w", err)
}
} else if c.isExtensionV1Beta1IngressSupported {
err = c.KubeClient.ExtensionsV1beta1().Ingresses(c.Namespace).Delete(context.TODO(), name, metav1.DeleteOptions{})
if err != nil {
return fmt.Errorf("failed to delete extensionv v1beta1 ingress %w", err)
}
}
return nil
}
//ListIngresses lists all the ingresses based on given label selector
func (c *Client) ListIngresses(labelSelector string) (*unions.KubernetesIngressList, error) {
kubernetesIngressList := unions.NewEmptyKubernetesIngressList()
err := c.checkIngressSupport()
if err != nil {
return nil, err
}
// if networking v1 ingress is supported then extension v1 ingress are automatically wrapped
// by net v1 ingresses
if c.isNetworkingV1IngressSupported {
ingressList, err := c.KubeClient.NetworkingV1().Ingresses(c.Namespace).List(context.TODO(), metav1.ListOptions{
LabelSelector: labelSelector,
})
if err != nil {
return nil, fmt.Errorf("unable to list ingresses as networking v1 ingresses %w", err)
} else {
for k := range ingressList.Items {
ki := unions.NewNonGeneratedKubernetesIngress()
ki.NetworkingV1Ingress = &ingressList.Items[k]
kubernetesIngressList.Items = append(kubernetesIngressList.Items, ki)
}
}
return kubernetesIngressList, nil
} else if c.isExtensionV1Beta1IngressSupported {
ingressList, err := c.KubeClient.ExtensionsV1beta1().Ingresses(c.Namespace).List(context.TODO(), metav1.ListOptions{
LabelSelector: labelSelector,
})
if err != nil {
return nil, fmt.Errorf("unable to list ingresses as extensions v1 ingress %w", err)
} else {
for k := range ingressList.Items {
ki := unions.NewNonGeneratedKubernetesIngress()
ki.ExtensionV1Beta1Ingress = &ingressList.Items[k]
kubernetesIngressList.Items = append(kubernetesIngressList.Items, ki)
}
}
return kubernetesIngressList, nil
}
return kubernetesIngressList, fmt.Errorf("ingresses on cluster are not supported")
}
func (c *Client) GetIngress(name string) (*unions.KubernetesIngress, error) {
ki := unions.NewNonGeneratedKubernetesIngress()
err := c.checkIngressSupport()
if err != nil {
return nil, err
}
if c.isNetworkingV1IngressSupported {
ki.NetworkingV1Ingress, err = c.KubeClient.NetworkingV1().Ingresses(c.Namespace).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil {
return nil, err
}
return ki, nil
}
if c.isExtensionV1Beta1IngressSupported {
ki.ExtensionV1Beta1Ingress, err = c.KubeClient.ExtensionsV1beta1().Ingresses(c.Namespace).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil {
return nil, err
}
return ki, nil
}
return nil, fmt.Errorf("could not get supported type of ingress")
}