Skip to content

Commit

Permalink
Set the ingress default backend to a 404 response
Browse files Browse the repository at this point in the history
  • Loading branch information
bigkraig committed Sep 17, 2018
1 parent ddfe2b6 commit a777672
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 30 deletions.
56 changes: 35 additions & 21 deletions internal/alb/ls/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,34 +150,48 @@ func NewCurrentListener(o *NewCurrentListenerOptions) (*Listener, error) {
}, nil
}

func (l *Listener) resolveDefaultBackend(rOpts *ReconcileOptions) (*elbv2.Action, error) {
if l.defaultBackend.ServicePort.String() == "use-annotation" {
if l.defaultBackend.ServiceName == Default404 {
return default404Action(), nil
}

annos, err := rOpts.Store.GetIngressAnnotations(k8s.MetaNamespaceKey(rOpts.Ingress))
if err != nil {
return nil, err
}

ruleConfig, ok := annos.Action.Actions[l.defaultBackend.ServiceName]
if !ok {
return nil, fmt.Errorf("`servicePort: use-annotation` was requested for"+
"`serviceName: %v` but an annotation for that action does not exist", l.defaultBackend.ServiceName)
}

return ruleConfig, nil

}

i := rOpts.TargetGroups.LookupByBackend(*l.defaultBackend)
if i < 0 {
return nil, fmt.Errorf("Cannot reconcile listeners, unable to find a target group for default backend %s", l.defaultBackend.String())
}

action := l.ls.desired.DefaultActions[0]
action.TargetGroupArn = rOpts.TargetGroups[i].CurrentARN()
return action, nil
}

// Reconcile compares the current and desired state of this Listener instance. Comparison
// results in no action, the creation, the deletion, or the modification of an AWS listener to
// satisfy the ingress's current state.
func (l *Listener) Reconcile(rOpts *ReconcileOptions) error {
func (l *Listener) Reconcile(rOpts *ReconcileOptions) (err error) {
// If there is a desired listener, set some of the ARNs which are not available when we assemble the desired state
if l.ls.desired != nil {
l.ls.desired.LoadBalancerArn = rOpts.LoadBalancerArn

if l.defaultBackend.ServicePort.String() == "use-annotation" {
annos, err := rOpts.Store.GetIngressAnnotations(k8s.MetaNamespaceKey(rOpts.Ingress))
if err != nil {
return err
}

ruleConfig, ok := annos.Action.Actions[l.defaultBackend.ServiceName]
if !ok {
return fmt.Errorf("`servicePort: use-annotation` was requested for"+
"`serviceName: %v` but an annotation for that action does not exist", l.defaultBackend.ServiceName)
}

l.ls.desired.DefaultActions[0] = ruleConfig

} else {
i := rOpts.TargetGroups.LookupByBackend(*l.defaultBackend)
if i < 0 {
return fmt.Errorf("Cannot reconcile listeners, unable to find a target group for default backend %s", l.defaultBackend.String())
}
l.ls.desired.DefaultActions[0].TargetGroupArn = rOpts.TargetGroups[i].CurrentARN()
l.ls.desired.DefaultActions[0], err = l.resolveDefaultBackend(rOpts)
if err != nil {
return err
}
}

Expand Down
14 changes: 14 additions & 0 deletions internal/alb/ls/types.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ls

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/elbv2"
"github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/alb/rs"
"github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/alb/tg"
Expand Down Expand Up @@ -33,3 +34,16 @@ type ReconcileOptions struct {
LoadBalancerArn *string
TargetGroups tg.TargetGroups
}

const Default404 = "Default 404"

func default404Action() *elbv2.Action {
return &elbv2.Action{
Type: aws.String("fixed-response"),
FixedResponseConfig: &elbv2.FixedResponseActionConfig{
ContentType: aws.String("text/plain"),
// MessageBody:
StatusCode: aws.String("404"),
},
}
}
14 changes: 5 additions & 9 deletions internal/albingress/albingresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import (

"github.com/aws/aws-sdk-go/service/elbv2"
"github.com/golang/glog"
"github.com/kubernetes-sigs/aws-alb-ingress-controller/internal/alb/ls"
pool "gopkg.in/go-playground/pool.v3"
"k8s.io/apimachinery/pkg/util/intstr"

api "k8s.io/api/core/v1"
extensions "k8s.io/api/extensions/v1beta1"
Expand Down Expand Up @@ -230,15 +232,9 @@ func newIngressesFromLoadBalancers(o *newIngressesFromLoadBalancersOptions) ALBI

func applyDefaults(i *extensions.Ingress) {
if i.Spec.Backend == nil {
BACKEND:
for _, r := range i.Spec.Rules {
if r.HTTP == nil {
continue
}
for _, p := range r.HTTP.Paths {
i.Spec.Backend = &p.Backend
break BACKEND
}
i.Spec.Backend = &extensions.IngressBackend{
ServiceName: ls.Default404,
ServicePort: intstr.FromString("use-annotation"),
}
}
}

0 comments on commit a777672

Please sign in to comment.