github.com/terraform-modules-krish/terratest@v0.29.0/modules/k8s/ingress.go (about)

     1  package k8s
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  	extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  
    12  	"github.com/terraform-modules-krish/terratest/modules/logger"
    13  	"github.com/terraform-modules-krish/terratest/modules/retry"
    14  	"github.com/terraform-modules-krish/terratest/modules/testing"
    15  )
    16  
    17  // ListIngresses will look for Ingress resources in the given namespace that match the given filters and return them.
    18  // This will fail the test if there is an error.
    19  func ListIngresses(t testing.TestingT, options *KubectlOptions, filters metav1.ListOptions) []extensionsv1beta1.Ingress {
    20  	ingresses, err := ListIngressesE(t, options, filters)
    21  	require.NoError(t, err)
    22  	return ingresses
    23  }
    24  
    25  // ListIngressesE will look for Ingress resources in the given namespace that match the given filters and return them.
    26  func ListIngressesE(t testing.TestingT, options *KubectlOptions, filters metav1.ListOptions) ([]extensionsv1beta1.Ingress, error) {
    27  	clientset, err := GetKubernetesClientFromOptionsE(t, options)
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	resp, err := clientset.ExtensionsV1beta1().Ingresses(options.Namespace).List(context.Background(), filters)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	return resp.Items, nil
    36  
    37  }
    38  
    39  // GetIngress returns a Kubernetes Ingress resource in the provided namespace with the given name. This will fail the
    40  // test if there is an error.
    41  func GetIngress(t testing.TestingT, options *KubectlOptions, ingressName string) *extensionsv1beta1.Ingress {
    42  	ingress, err := GetIngressE(t, options, ingressName)
    43  	require.NoError(t, err)
    44  	return ingress
    45  }
    46  
    47  // GetIngressE returns a Kubernetes Ingress resource in the provided namespace with the given name.
    48  func GetIngressE(t testing.TestingT, options *KubectlOptions, ingressName string) (*extensionsv1beta1.Ingress, error) {
    49  	clientset, err := GetKubernetesClientFromOptionsE(t, options)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return clientset.ExtensionsV1beta1().Ingresses(options.Namespace).Get(context.Background(), ingressName, metav1.GetOptions{})
    54  }
    55  
    56  // IsIngressAvailable returns true if the Ingress endpoint is provisioned and available.
    57  func IsIngressAvailable(ingress *extensionsv1beta1.Ingress) bool {
    58  	// Ingress is ready if it has at least one endpoint
    59  	endpoints := ingress.Status.LoadBalancer.Ingress
    60  	return len(endpoints) > 0
    61  }
    62  
    63  // WaitUntilIngressAvailable waits until the Ingress resource has an endpoint provisioned for it.
    64  func WaitUntilIngressAvailable(t testing.TestingT, options *KubectlOptions, ingressName string, retries int, sleepBetweenRetries time.Duration) {
    65  	statusMsg := fmt.Sprintf("Wait for ingress %s to be provisioned.", ingressName)
    66  	message := retry.DoWithRetry(
    67  		t,
    68  		statusMsg,
    69  		retries,
    70  		sleepBetweenRetries,
    71  		func() (string, error) {
    72  			ingress, err := GetIngressE(t, options, ingressName)
    73  			if err != nil {
    74  				return "", err
    75  			}
    76  			if !IsIngressAvailable(ingress) {
    77  				return "", IngressNotAvailable{ingress: ingress}
    78  			}
    79  			return "Ingress is now available", nil
    80  		},
    81  	)
    82  	logger.Logf(t, message)
    83  }