1
1
package ls
2
2
3
3
import (
4
+ "fmt"
5
+
4
6
"github.com/aws/aws-sdk-go/aws"
5
7
"github.com/aws/aws-sdk-go/service/elbv2"
6
8
"github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/alb/rs"
9
+ "github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/alb/tg"
7
10
"github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/annotations"
8
11
"github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/aws/albelbv2"
9
12
"github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/util/log"
10
13
util "github.com/kubernetes-sigs/aws-alb-ingress-controller/pkg/util/types"
11
14
api "k8s.io/api/core/v1"
15
+ extensions "k8s.io/api/extensions/v1beta1"
12
16
)
13
17
14
18
type NewDesiredListenerOptions struct {
15
- Port annotations.PortData
16
- CertificateArn * string
17
- Logger * log.Logger
18
- SslPolicy * string
19
+ ExistingListener * Listener
20
+ Port annotations.PortData
21
+ CertificateArn * string
22
+ Logger * log.Logger
23
+ SslPolicy * string
24
+ IngressRules []extensions.IngressRule
25
+ IgnoreHostHeader bool
19
26
}
20
27
21
28
// NewDesiredListener returns a new listener.Listener based on the parameters provided.
22
- func NewDesiredListener (o * NewDesiredListenerOptions ) * Listener {
23
- listener := & elbv2.Listener {
29
+ func NewDesiredListener (o * NewDesiredListenerOptions ) ( * Listener , error ) {
30
+ l := & elbv2.Listener {
24
31
Port : aws .Int64 (o .Port .Port ),
25
32
Protocol : aws .String ("HTTP" ),
26
33
DefaultActions : []* elbv2.Action {
@@ -31,35 +38,72 @@ func NewDesiredListener(o *NewDesiredListenerOptions) *Listener {
31
38
}
32
39
33
40
if o .CertificateArn != nil && o .Port .Scheme == "HTTPS" {
34
- listener .Certificates = []* elbv2.Certificate {
41
+ l .Certificates = []* elbv2.Certificate {
35
42
{CertificateArn : o .CertificateArn },
36
43
}
37
- listener .Protocol = aws .String ("HTTPS" )
44
+ l .Protocol = aws .String ("HTTPS" )
38
45
}
39
46
40
47
if o .SslPolicy != nil && o .Port .Scheme == "HTTPS" {
41
- listener .SslPolicy = o .SslPolicy
48
+ l .SslPolicy = o .SslPolicy
42
49
}
43
50
44
- listenerT := & Listener {
45
- ls : ls {desired : listener },
51
+ listener := & Listener {
52
+ ls : ls {desired : l },
46
53
logger : o .Logger ,
47
54
}
48
55
49
- return listenerT
56
+ if o .ExistingListener != nil {
57
+ listener .rules = o .ExistingListener .rules
58
+ }
59
+
60
+ var p int
61
+ for _ , rule := range o .IngressRules {
62
+ var err error
63
+
64
+ listener .rules , p , err = rs .NewDesiredRules (& rs.NewDesiredRulesOptions {
65
+ Priority : p ,
66
+ Logger : o .Logger ,
67
+ ListenerRules : listener .rules ,
68
+ Rule : & rule ,
69
+ IgnoreHostHeader : o .IgnoreHostHeader ,
70
+ })
71
+ if err != nil {
72
+ return nil , err
73
+ }
74
+ }
75
+
76
+ if o .ExistingListener != nil {
77
+ o .ExistingListener .ls .desired = listener .ls .desired
78
+ o .ExistingListener .rules = listener .rules
79
+ return o .ExistingListener , nil
80
+ }
81
+
82
+ return listener , nil
50
83
}
51
84
52
85
type NewCurrentListenerOptions struct {
53
- Listener * elbv2.Listener
54
- Logger * log.Logger
86
+ Listener * elbv2.Listener
87
+ Logger * log.Logger
88
+ TargetGroups tg.TargetGroups
55
89
}
56
90
57
91
// NewCurrentListener returns a new listener.Listener based on an elbv2.Listener.
58
- func NewCurrentListener (o * NewCurrentListenerOptions ) * Listener {
92
+ func NewCurrentListener (o * NewCurrentListenerOptions ) (* Listener , error ) {
93
+ rules , err := rs .NewCurrentRules (& rs.NewCurrentRulesOptions {
94
+ ListenerArn : o .Listener .ListenerArn ,
95
+ Logger : o .Logger ,
96
+ TargetGroups : o .TargetGroups ,
97
+ })
98
+ if err != nil {
99
+ return nil , err
100
+ }
101
+
59
102
return & Listener {
60
103
ls : ls {current : o .Listener },
61
104
logger : o .Logger ,
62
- }
105
+ rules : rules ,
106
+ }, nil
63
107
}
64
108
65
109
// Reconcile compares the current and desired state of this Listener instance. Comparison
@@ -89,16 +133,22 @@ func (l *Listener) Reconcile(rOpts *ReconcileOptions) error {
89
133
* l .ls .current .Protocol )
90
134
91
135
case l .needsModification (rOpts ): // current and desired diff; needs mod
92
- l .logger .Infof ("Start Listener modification." )
93
136
if err := l .modify (rOpts ); err != nil {
94
137
return err
95
138
}
96
139
rOpts .Eventf (api .EventTypeNormal , "MODIFY" , "%v listener modified" , * l .ls .current .Port )
97
- l .logger .Infof ("Completed Listener modification. ARN: %s | Port: %v | Proto: %s." ,
98
- * l .ls .current .ListenerArn , * l .ls .current .Port , * l .ls .current .Protocol )
140
+ }
99
141
100
- default :
101
- // l.logger.Debugf("No listener modification required.")
142
+ if l .ls .current != nil {
143
+ if rs , err := l .rules .Reconcile (& rs.ReconcileOptions {
144
+ Eventf : rOpts .Eventf ,
145
+ ListenerArn : l .ls .current .ListenerArn ,
146
+ TargetGroups : rOpts .TargetGroups ,
147
+ }); err != nil {
148
+ return err
149
+ } else {
150
+ l .rules = rs
151
+ }
102
152
}
103
153
104
154
return nil
@@ -132,8 +182,7 @@ func (l *Listener) create(rOpts *ReconcileOptions) error {
132
182
o , err := albelbv2 .ELBV2svc .CreateListener (in )
133
183
if err != nil {
134
184
rOpts .Eventf (api .EventTypeWarning , "ERROR" , "Error creating %v listener: %s" , * desired .Port , err .Error ())
135
- l .logger .Errorf ("Failed Listener creation: %s." , err .Error ())
136
- return err
185
+ return fmt .Errorf ("Failed Listener creation: %s." , err .Error ())
137
186
}
138
187
139
188
l .ls .current = o .Listeners [0 ]
@@ -160,9 +209,7 @@ func (l *Listener) modify(rOpts *ReconcileOptions) error {
160
209
o , err := albelbv2 .ELBV2svc .ModifyListener (in )
161
210
if err != nil {
162
211
rOpts .Eventf (api .EventTypeWarning , "ERROR" , "Error modifying %v listener: %s" , * desired .Port , err .Error ())
163
- l .logger .Errorf ("Failed Listener modification: %s." , err .Error ())
164
- l .logger .Debugf ("Payload: %s" , log .Prettify (in ))
165
- return err
212
+ return fmt .Errorf ("Failed Listener modification: %s" , err .Error ())
166
213
}
167
214
l .ls .current = o .Listeners [0 ]
168
215
@@ -173,9 +220,7 @@ func (l *Listener) modify(rOpts *ReconcileOptions) error {
173
220
func (l * Listener ) delete (rOpts * ReconcileOptions ) error {
174
221
if err := albelbv2 .ELBV2svc .RemoveListener (l .ls .current .ListenerArn ); err != nil {
175
222
rOpts .Eventf (api .EventTypeWarning , "ERROR" , "Error deleting %v listener: %s" , * l .ls .current .Port , err .Error ())
176
- l .logger .Errorf ("Failed Listener deletion. ARN: %s: %s" ,
177
- * l .ls .current .ListenerArn , err .Error ())
178
- return err
223
+ return fmt .Errorf ("Failed Listener deletion. ARN: %s: %s" , * l .ls .current .ListenerArn , err .Error ())
179
224
}
180
225
181
226
l .deleted = true
0 commit comments