in watcher/handlerIngress.go [138:332]
func (g *IgHandler) update(obj, newObj interface{}) {
ingressObj, ok := obj.(*nv1.Ingress)
if !ok {
log.Println("In HandlerIngress Update; cannot cast to *nv1.Ingress")
return
}
newIngressObj, ok := newObj.(*nv1.Ingress)
if !ok {
log.Println("In HandlerIngress Update; cannot cast to *nv1.Ingress")
return
}
m := make(map[string]string)
namespace := ingressObj.GetNamespace()
// v1.18 ingress class name field in ingress object
//ingressClass, _ := util.ExtractIngressClass(ingressObj.GetAnnotations())
ingressClass, _ := util.ExtractIngressClassName(obj)
if g.Ep.NsManager.IncludeNamespace(namespace) && g.Ep.ATSManager.IncludeIngressClass(ingressClass) {
log.Println("Old Namespace included")
name := ingressObj.GetName()
version := ingressObj.GetResourceVersion()
nameversion := util.ConstructNameVersionString(namespace, name, version)
_, snippetErr := util.ExtractServerSnippet(ingressObj.GetAnnotations())
// handle default backend rules
if ingressObj.Spec.DefaultBackend != nil {
host := "*"
scheme := "http"
path := "/"
pathType := nv1.PathTypePrefix
hostPath := util.ConstructHostPathString(scheme, host, path, pathType)
g.Ep.RedisClient.DBOneSUnionStore("temp_"+hostPath, hostPath)
m["temp_"+hostPath] = hostPath
service := ingressObj.Spec.DefaultBackend.Service.Name
port := strconv.Itoa(int(ingressObj.Spec.DefaultBackend.Service.Port.Number))
svcport := util.ConstructSvcPortString(namespace, service, port)
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, svcport)
if snippetErr == nil {
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, nameversion)
}
// handle default backend https rule
scheme = "https"
hostPath = util.ConstructHostPathString(scheme, host, path, pathType)
g.Ep.RedisClient.DBOneSUnionStore("temp_"+hostPath, hostPath)
m["temp_"+hostPath] = hostPath
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, svcport)
if snippetErr == nil {
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, nameversion)
}
}
tlsHosts := make(map[string]string)
for _, ingressTLS := range ingressObj.Spec.TLS {
for _, tlsHost := range ingressTLS.Hosts {
tlsHosts[tlsHost] = "1"
}
}
for _, ingressRule := range ingressObj.Spec.Rules {
host := ingressRule.Host
if host == "" {
host = "*"
}
scheme := "http"
if _, ok := tlsHosts[host]; ok {
scheme = "https"
}
for _, httpPath := range ingressRule.HTTP.Paths {
path := httpPath.Path
pathType := *httpPath.PathType
hostPath := util.ConstructHostPathString(scheme, host, path, pathType)
g.Ep.RedisClient.DBOneSUnionStore("temp_"+hostPath, hostPath)
m["temp_"+hostPath] = hostPath
service := httpPath.Backend.Service.Name
port := strconv.Itoa(int(httpPath.Backend.Service.Port.Number))
svcport := util.ConstructSvcPortString(namespace, service, port)
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, svcport)
if snippetErr == nil {
g.Ep.RedisClient.DBOneSRem("temp_"+hostPath, nameversion)
}
}
}
}
newNamespace := newIngressObj.GetNamespace()
// v1.18 ingress class name field in ingress object
//newIngressClass, _ := util.ExtractIngressClass(newIngressObj.GetAnnotations())
newIngressClass, _ := util.ExtractIngressClassName(newObj)
if g.Ep.NsManager.IncludeNamespace(newNamespace) && g.Ep.ATSManager.IncludeIngressClass(newIngressClass) {
log.Println("New Namespace included")
name := newIngressObj.GetName()
version := newIngressObj.GetResourceVersion()
nameversion := util.ConstructNameVersionString(newNamespace, name, version)
newSnippet, newSnippetErr := util.ExtractServerSnippet(newIngressObj.GetAnnotations())
if newSnippetErr == nil {
g.Ep.RedisClient.DBOneSAdd(nameversion, newSnippet)
}
// handle default backend rule
if newIngressObj.Spec.DefaultBackend != nil {
host := "*"
scheme := "http"
path := "/"
pathType := nv1.PathTypePrefix
hostPath := util.ConstructHostPathString(scheme, host, path, pathType)
service := newIngressObj.Spec.DefaultBackend.Service.Name
port := strconv.Itoa(int(newIngressObj.Spec.DefaultBackend.Service.Port.Number))
svcport := util.ConstructSvcPortString(newNamespace, service, port)
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, svcport)
m["temp_"+hostPath] = hostPath
if newSnippetErr == nil {
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, nameversion)
}
// handle default backend rule for https as well
scheme = "https"
hostPath = util.ConstructHostPathString(scheme, host, path, pathType)
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, svcport)
m["temp_"+hostPath] = hostPath
if newSnippetErr == nil {
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, nameversion)
}
}
newTlsHosts := make(map[string]string)
for _, newIngressTLS := range newIngressObj.Spec.TLS {
for _, newTlsHost := range newIngressTLS.Hosts {
newTlsHosts[newTlsHost] = "1"
}
}
for _, ingressRule := range newIngressObj.Spec.Rules {
host := ingressRule.Host
if host == "" {
host = "*"
}
scheme := "http"
if _, ok := newTlsHosts[host]; ok {
scheme = "https"
}
for _, httpPath := range ingressRule.HTTP.Paths {
path := httpPath.Path
pathType := *httpPath.PathType
hostPath := util.ConstructHostPathString(scheme, host, path, pathType)
service := httpPath.Backend.Service.Name
port := strconv.Itoa(int(httpPath.Backend.Service.Port.Number))
svcport := util.ConstructSvcPortString(newNamespace, service, port)
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, svcport)
m["temp_"+hostPath] = hostPath
if newSnippetErr == nil {
g.Ep.RedisClient.DBOneSAdd("temp_"+hostPath, nameversion)
}
}
}
}
for key, value := range m {
g.Ep.RedisClient.DBOneSUnionStore(value, key)
g.Ep.RedisClient.DBOneDel(key)
}
}