Skip to content

Commit 6983e3f

Browse files
authored
Merge pull request #3 from nginxinc/fix-delete-functionality
Implement logic supporting Delete events
2 parents dfc2756 + 8249bf7 commit 6983e3f

File tree

3 files changed

+58
-14
lines changed

3 files changed

+58
-14
lines changed

internal/core/events.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type Event struct {
2121
}
2222

2323
type ServerUpdateEvent struct {
24-
id string
24+
Type EventType
2525
UpstreamName string
2626
Servers []nginxClient.StreamUpstreamServer
2727
}
@@ -37,9 +37,23 @@ func NewEvent(eventType EventType, service *v1.Service, previousService *v1.Serv
3737
}
3838
}
3939

40-
func NewServerUpdateEvent(upstreamName string, servers []nginxClient.StreamUpstreamServer) *ServerUpdateEvent {
40+
func NewServerUpdateEvent(eventType EventType, upstreamName string, servers []nginxClient.StreamUpstreamServer) *ServerUpdateEvent {
4141
return &ServerUpdateEvent{
42+
Type: eventType,
4243
UpstreamName: upstreamName,
4344
Servers: servers,
4445
}
4546
}
47+
48+
func (e *ServerUpdateEvent) TypeName() string {
49+
switch e.Type {
50+
case Created:
51+
return "Created"
52+
case Updated:
53+
return "Updated"
54+
case Deleted:
55+
return "Deleted"
56+
default:
57+
return "Unknown"
58+
}
59+
}

internal/synchronization/synchronizer.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ func NewSynchronizer() (*Synchronizer, error) {
3434
}
3535

3636
func (s *Synchronizer) AddEvents(events core.ServerUpdateEvents) {
37-
logrus.Debug(`Synchronizer::AddEvents adding %d events`, len(events))
37+
logrus.Debugf(`Synchronizer::AddEvents adding %d events`, len(events))
38+
39+
// TODO: Add fan-out for multiple NginxClients
3840
for _, event := range events {
3941
s.AddEvent(event)
4042
}
@@ -86,12 +88,25 @@ func (s *Synchronizer) ShutDown() {
8688
func (s *Synchronizer) handleEvent(serverUpdateEvent *core.ServerUpdateEvent) error {
8789
logrus.Debugf(`Synchronizer::handleEvent: %#v`, serverUpdateEvent)
8890

89-
_, _, _, err := s.NginxPlusClient.UpdateStreamServers(serverUpdateEvent.UpstreamName, serverUpdateEvent.Servers)
90-
if err != nil {
91-
return fmt.Errorf(`error occurred updating the nginx+ host: %w`, err)
91+
switch serverUpdateEvent.Type {
92+
case core.Created:
93+
fallthrough
94+
case core.Updated:
95+
_, _, _, err := s.NginxPlusClient.UpdateStreamServers(serverUpdateEvent.UpstreamName, serverUpdateEvent.Servers)
96+
if err != nil {
97+
return fmt.Errorf(`error occurred updating the nginx+ upstream servers: %w`, err)
98+
}
99+
case core.Deleted:
100+
// NOTE: Deleted events include a single server in the array
101+
err := s.NginxPlusClient.DeleteStreamServer(serverUpdateEvent.UpstreamName, serverUpdateEvent.Servers[0].Server)
102+
if err != nil {
103+
return fmt.Errorf(`error occurred deleting the nginx+ upstream server: %w`, err)
104+
}
105+
default:
106+
logrus.Warnf(`Synchronizer::handleEvent: unknown event type: %d`, serverUpdateEvent.Type)
92107
}
93108

94-
logrus.Infof(`Synchronizer::handleEvent: successfully updated the nginx+ hosts for Ingress: "%s"`, serverUpdateEvent.UpstreamName)
109+
logrus.Infof(`Synchronizer::handleEvent: successfully %s the nginx+ hosts for Ingress: "%s"`, serverUpdateEvent.TypeName(), serverUpdateEvent.UpstreamName)
95110

96111
return nil
97112
}

internal/translation/translator.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func Translate(event *core.Event) (core.ServerUpdateEvents, error) {
2020

2121
portsOfInterest := filterPorts(event.Service.Spec.Ports)
2222

23-
return buildServerUpdateEvents(portsOfInterest, event.NodeIps)
23+
return buildServerUpdateEvents(portsOfInterest, event)
2424
}
2525

2626
func filterPorts(ports []v1.ServicePort) []v1.ServicePort {
@@ -35,19 +35,34 @@ func filterPorts(ports []v1.ServicePort) []v1.ServicePort {
3535
return portsOfInterest
3636
}
3737

38-
// TODO: Get the list of Node IPs from the Kubernetes API and fan out over the port
39-
func buildServerUpdateEvents(ports []v1.ServicePort, nodeIps []string) (core.ServerUpdateEvents, error) {
38+
// buildServerUpdateEvents builds a list of ServerUpdateEvents based on the event type
39+
// The NGINX+ Client uses a list of servers for Created and Updated events; the client performs reconciliation between
40+
// the list of servers in the NGINX+ Client call and the list of servers in NGINX+.
41+
// The NGINX+ Client uses a single server for Deleted events; so the list of servers is broken up into individual events.
42+
func buildServerUpdateEvents(ports []v1.ServicePort, event *core.Event) (core.ServerUpdateEvents, error) {
4043
logrus.Debugf("Translate::buildServerUpdateEvents(ports=%#v)", ports)
4144

42-
upstreams := core.ServerUpdateEvents{}
45+
updateEvents := core.ServerUpdateEvents{}
4346
for _, port := range ports {
4447
ingressName := fixIngressName(port.Name)
45-
servers, _ := buildServers(nodeIps, port)
48+
servers, _ := buildServers(event.NodeIps, port)
49+
50+
switch event.Type {
51+
case core.Created:
52+
fallthrough
53+
case core.Updated:
54+
updateEvents = append(updateEvents, core.NewServerUpdateEvent(event.Type, ingressName, servers))
55+
case core.Deleted:
56+
for _, server := range servers {
57+
updateEvents = append(updateEvents, core.NewServerUpdateEvent(event.Type, ingressName, []nginxClient.StreamUpstreamServer{server}))
58+
}
59+
default:
60+
logrus.Warnf(`Translator::buildServerUpdateEvents: unknown event type: %d`, event.Type)
61+
}
4662

47-
upstreams = append(upstreams, core.NewServerUpdateEvent(ingressName, servers))
4863
}
4964

50-
return upstreams, nil
65+
return updateEvents, nil
5166
}
5267

5368
func buildServers(nodeIps []string, port v1.ServicePort) ([]nginxClient.StreamUpstreamServer, error) {

0 commit comments

Comments
 (0)