github.com/jenkins-x/jx/v2@v2.1.155/pkg/kube/ingress.go (about)

     1  package kube
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"strconv"
     8  
     9  	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    10  	"k8s.io/client-go/kubernetes"
    11  )
    12  
    13  const (
    14  	IngressConfigConfigmap = "ingress-config"
    15  	Domain                 = "domain"
    16  	Email                  = "email"
    17  	TLS                    = "tls"
    18  	Issuer                 = "issuer"
    19  	ClusterIssuer          = "clusterissuer"
    20  	Exposer                = "exposer"
    21  	UrlTemplate            = "urltemplate"
    22  )
    23  
    24  type IngressConfig struct {
    25  	Email         string `structs:"email" yaml:"email" json:"email"`
    26  	Domain        string `structs:"domain" yaml:"domain" json:"domain"`
    27  	Issuer        string `structs:"issuer" yaml:"issuer" json:"issuer"`
    28  	ClusterIssuer bool   `structs:"clusterissuer" yaml:"clusterissuer" json:"clusterissuer"`
    29  	Exposer       string `structs:"exposer" yaml:"exposer" json:"exposer"`
    30  	UrlTemplate   string `structs:"urltemplate" yaml:"urltemplate" json:"urltemplate"`
    31  	TLS           bool   `structs:"tls" yaml:"tls" json:"tls"`
    32  }
    33  
    34  func GetIngress(client kubernetes.Interface, ns, name string) (string, error) {
    35  
    36  	ing, err := client.ExtensionsV1beta1().Ingresses(ns).Get(name, meta_v1.GetOptions{})
    37  	if err != nil {
    38  		return "", fmt.Errorf("failed to get ingress rule %s. error: %v", name, err)
    39  	}
    40  	if ing == nil {
    41  		return "", fmt.Errorf("failed to find ingress rule %s", name)
    42  	}
    43  
    44  	// default to the first rule
    45  	if len(ing.Spec.Rules) > 0 {
    46  		return ing.Spec.Rules[0].Host, nil
    47  	}
    48  	return "", fmt.Errorf("no hostname found for ingress rule %s", name)
    49  }
    50  
    51  func GetIngressConfig(c kubernetes.Interface, ns string) (IngressConfig, error) {
    52  	var ic IngressConfig
    53  	configMapInterface := c.CoreV1().ConfigMaps(ns)
    54  	cm, err := configMapInterface.Get(IngressConfigConfigmap, meta_v1.GetOptions{})
    55  	data := map[string]string{}
    56  	if err != nil {
    57  		cm2, err2 := configMapInterface.Get("exposecontroller", meta_v1.GetOptions{})
    58  		if err2 != nil {
    59  			return ic, err
    60  		}
    61  		config := cm2.Data["config.yml"]
    62  		lines := strings.Split(config, "\n")
    63  		for _, pair := range lines {
    64  			z := strings.Split(pair, ":")
    65  			data[z[0]] = strings.TrimSpace(z[1])
    66  		}
    67  		return ic, err
    68  	} else {
    69  		data = cm.Data
    70  	}
    71  
    72  	ic.Domain = data[Domain]
    73  	ic.Email = data[Email]
    74  	ic.Exposer = data[Exposer]
    75  	ic.UrlTemplate = data[UrlTemplate]
    76  	ic.Issuer = data[Issuer]
    77  	clusterIssuer, exists := data[ClusterIssuer]
    78  
    79  	if exists {
    80  		ic.ClusterIssuer, err = strconv.ParseBool(clusterIssuer)
    81  		if err != nil {
    82  			return ic, fmt.Errorf("failed to parse ClusterIssuer string %s to bool from %s: %v", clusterIssuer, IngressConfigConfigmap, err)
    83  		}
    84  	} else {
    85  		ic.ClusterIssuer = false
    86  	}
    87  
    88  	tls, exists := data[TLS]
    89  
    90  	if exists && tls != "" {
    91  		ic.TLS, err = strconv.ParseBool(tls)
    92  		if err != nil {
    93  			return ic, fmt.Errorf("failed to parse TLS string %s to bool from %s: %v", tls, IngressConfigConfigmap, err)
    94  		}
    95  	} else {
    96  		ic.TLS = false
    97  	}
    98  	return ic, nil
    99  }
   100  
   101  // DeleteIngress removes an ingress by name
   102  func DeleteIngress(client kubernetes.Interface, ns, name string) error {
   103  	return client.ExtensionsV1beta1().Ingresses(ns).Delete(name, &meta_v1.DeleteOptions{})
   104  }