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 }