Improve parsing of annotations and use of Ingress wrapper
This commit is contained in:
parent
ccd7b890fd
commit
67808c0ed8
13 changed files with 278 additions and 334 deletions
|
|
@ -73,9 +73,6 @@ type Storer interface {
|
|||
// GetServiceEndpoints returns the Endpoints of a Service matching key.
|
||||
GetServiceEndpoints(key string) (*corev1.Endpoints, error)
|
||||
|
||||
// GetIngress returns the Ingress matching key.
|
||||
GetIngress(key string) (*extensions.Ingress, error)
|
||||
|
||||
// ListIngresses returns a list of all Ingresses in the store.
|
||||
ListIngresses() []*ingress.Ingress
|
||||
|
||||
|
|
@ -132,13 +129,13 @@ type Informer struct {
|
|||
|
||||
// Lister contains object listers (stores).
|
||||
type Lister struct {
|
||||
Ingress IngressLister
|
||||
Service ServiceLister
|
||||
Endpoint EndpointLister
|
||||
Secret SecretLister
|
||||
ConfigMap ConfigMapLister
|
||||
IngressAnnotation IngressAnnotationsLister
|
||||
Pod PodLister
|
||||
Ingress IngressLister
|
||||
Service ServiceLister
|
||||
Endpoint EndpointLister
|
||||
Secret SecretLister
|
||||
ConfigMap ConfigMapLister
|
||||
IngressWithAnnotation IngressWithAnnotationsLister
|
||||
Pod PodLister
|
||||
}
|
||||
|
||||
// NotExistsError is returned when an object does not exist in a local store.
|
||||
|
|
@ -261,7 +258,7 @@ func New(checkOCSP bool,
|
|||
// k8sStore fulfills resolver.Resolver interface
|
||||
store.annotations = annotations.NewAnnotationExtractor(store)
|
||||
|
||||
store.listers.IngressAnnotation.Store = cache.NewStore(cache.DeletionHandlingMetaNamespaceKeyFunc)
|
||||
store.listers.IngressWithAnnotation.Store = cache.NewStore(cache.DeletionHandlingMetaNamespaceKeyFunc)
|
||||
|
||||
// create informers factory, enable and assign required informers
|
||||
infFactory := informers.NewSharedInformerFactoryWithOptions(client, resyncPeriod,
|
||||
|
|
@ -343,7 +340,7 @@ func New(checkOCSP bool,
|
|||
}
|
||||
recorder.Eventf(ing, corev1.EventTypeNormal, "DELETE", fmt.Sprintf("Ingress %s/%s", ing.Namespace, ing.Name))
|
||||
|
||||
store.listers.IngressAnnotation.Delete(ing)
|
||||
store.listers.IngressWithAnnotation.Delete(ing)
|
||||
|
||||
key := k8s.MetaNamespaceKey(ing)
|
||||
store.secretIngressMap.Delete(key)
|
||||
|
|
@ -392,7 +389,7 @@ func New(checkOCSP bool,
|
|||
if ings := store.secretIngressMap.Reference(key); len(ings) > 0 {
|
||||
glog.Infof("secret %v was added and it is used in ingress annotations. Parsing...", key)
|
||||
for _, ingKey := range ings {
|
||||
ing, err := store.GetIngress(ingKey)
|
||||
ing, err := store.getIngress(ingKey)
|
||||
if err != nil {
|
||||
glog.Errorf("could not find Ingress %v in local store", ingKey)
|
||||
continue
|
||||
|
|
@ -419,7 +416,7 @@ func New(checkOCSP bool,
|
|||
if ings := store.secretIngressMap.Reference(key); len(ings) > 0 {
|
||||
glog.Infof("secret %v was updated and it is used in ingress annotations. Parsing...", key)
|
||||
for _, ingKey := range ings {
|
||||
ing, err := store.GetIngress(ingKey)
|
||||
ing, err := store.getIngress(ingKey)
|
||||
if err != nil {
|
||||
glog.Errorf("could not find Ingress %v in local store", ingKey)
|
||||
continue
|
||||
|
|
@ -458,7 +455,7 @@ func New(checkOCSP bool,
|
|||
if ings := store.secretIngressMap.Reference(key); len(ings) > 0 {
|
||||
glog.Infof("secret %v was deleted and it is used in ingress annotations. Parsing...", key)
|
||||
for _, ingKey := range ings {
|
||||
ing, err := store.GetIngress(ingKey)
|
||||
ing, err := store.getIngress(ingKey)
|
||||
if err != nil {
|
||||
glog.Errorf("could not find Ingress %v in local store", ingKey)
|
||||
continue
|
||||
|
|
@ -525,10 +522,10 @@ func New(checkOCSP bool,
|
|||
store.setConfig(cm)
|
||||
}
|
||||
|
||||
ings := store.listers.IngressAnnotation.List()
|
||||
ings := store.listers.IngressWithAnnotation.List()
|
||||
for _, ingKey := range ings {
|
||||
key := k8s.MetaNamespaceKey(ingKey)
|
||||
ing, err := store.GetIngress(key)
|
||||
ing, err := store.getIngress(key)
|
||||
if err != nil {
|
||||
glog.Errorf("could not find Ingress %v in local store: %v", key, err)
|
||||
continue
|
||||
|
|
@ -597,9 +594,24 @@ func (s *k8sStore) extractAnnotations(ing *extensions.Ingress) {
|
|||
key := k8s.MetaNamespaceKey(ing)
|
||||
glog.V(3).Infof("updating annotations information for ingress %v", key)
|
||||
|
||||
anns := s.annotations.Extract(ing)
|
||||
copyIng := ing.DeepCopy()
|
||||
|
||||
err := s.listers.IngressAnnotation.Update(anns)
|
||||
for ri, rule := range copyIng.Spec.Rules {
|
||||
if rule.HTTP == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for pi, path := range rule.HTTP.Paths {
|
||||
if path.Path == "" {
|
||||
copyIng.Spec.Rules[ri].HTTP.Paths[pi].Path = "/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err := s.listers.IngressWithAnnotation.Update(&ingress.Ingress{
|
||||
Ingress: *copyIng,
|
||||
ParsedAnnotations: s.annotations.Extract(copyIng),
|
||||
})
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
|
|
@ -697,59 +709,28 @@ func (s k8sStore) GetService(key string) (*corev1.Service, error) {
|
|||
return s.listers.Service.ByKey(key)
|
||||
}
|
||||
|
||||
// GetIngress returns the Ingress matching key.
|
||||
func (s k8sStore) GetIngress(key string) (*extensions.Ingress, error) {
|
||||
return s.listers.Ingress.ByKey(key)
|
||||
// getIngress returns the Ingress matching key.
|
||||
func (s k8sStore) getIngress(key string) (*extensions.Ingress, error) {
|
||||
ing, err := s.listers.IngressWithAnnotation.ByKey(key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ing.Ingress, nil
|
||||
}
|
||||
|
||||
// ListIngresses returns the list of Ingresses
|
||||
func (s k8sStore) ListIngresses() []*ingress.Ingress {
|
||||
// filter ingress rules
|
||||
var ingresses []*ingress.Ingress
|
||||
for _, item := range s.listers.Ingress.List() {
|
||||
ing := item.(*extensions.Ingress)
|
||||
if !class.IsValid(ing) {
|
||||
continue
|
||||
}
|
||||
|
||||
ingKey := k8s.MetaNamespaceKey(ing)
|
||||
anns, err := s.getIngressAnnotations(ingKey)
|
||||
if err != nil {
|
||||
glog.Errorf("Error getting Ingress annotations %q: %v", ingKey, err)
|
||||
|
||||
}
|
||||
|
||||
for ri, rule := range ing.Spec.Rules {
|
||||
if rule.HTTP == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for pi, path := range rule.HTTP.Paths {
|
||||
if path.Path == "" {
|
||||
ing.Spec.Rules[ri].HTTP.Paths[pi].Path = "/"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ingresses = append(ingresses, &ingress.Ingress{
|
||||
Ingress: *ing,
|
||||
ParsedAnnotations: anns,
|
||||
})
|
||||
ingresses := make([]*ingress.Ingress, 0)
|
||||
for _, item := range s.listers.IngressWithAnnotation.List() {
|
||||
ing := item.(*ingress.Ingress)
|
||||
ingresses = append(ingresses, ing)
|
||||
}
|
||||
|
||||
return ingresses
|
||||
}
|
||||
|
||||
// getIngressAnnotations returns the parsed annotations of an Ingress matching key.
|
||||
func (s k8sStore) getIngressAnnotations(key string) (*annotations.Ingress, error) {
|
||||
ia, err := s.listers.IngressAnnotation.ByKey(key)
|
||||
if err != nil {
|
||||
return &annotations.Ingress{}, err
|
||||
}
|
||||
|
||||
return ia, nil
|
||||
}
|
||||
|
||||
// GetLocalSSLCert returns the local copy of a SSLCert
|
||||
func (s k8sStore) GetLocalSSLCert(key string) (*ingress.SSLCert, error) {
|
||||
return s.sslStore.ByKey(key)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue