Skip to content

Commit 9d18d7f

Browse files
committed
REORG: Reorganize service handler in controller/service
- Remove Ingress resource from service handler (the IngressPath should be enough) - Rename Service.service to Service.resource
1 parent 143002a commit 9d18d7f

File tree

5 files changed

+66
-83
lines changed

5 files changed

+66
-83
lines changed

controller/ingress.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,11 @@ func (c *HAProxyController) igClassIsSupported(ingress *store.Ingress) bool {
6060

6161
func (c *HAProxyController) handleIngressPath(ingress *store.Ingress, host string, path *store.IngressPath, ruleIDs []rules.RuleID) (reload bool, err error) {
6262
sslPassthrough := c.sslPassthroughEnabled(*ingress, path)
63-
svc, err := service.NewCtx(c.Store, ingress, path, c.Cfg.Certificates, sslPassthrough)
63+
svc, err := service.New(c.Store, path, c.Cfg.Certificates, sslPassthrough, ingress.Annotations, c.Store.ConfigMaps.Main.Annotations)
6464
if err != nil {
6565
return
6666
}
67-
if svc.GetStatus() == DELETED {
67+
if path.Status == DELETED {
6868
return
6969
}
7070
// Backend
@@ -83,7 +83,7 @@ func (c *HAProxyController) handleIngressPath(ingress *store.Ingress, host strin
8383
SSLPassthrough: sslPassthrough,
8484
}
8585

86-
routeACLAnn := annotations.String("route-acl", svc.GetService().Annotations)
86+
routeACLAnn := annotations.String("route-acl", svc.GetResource().Annotations)
8787
if routeACLAnn == "" {
8888
if _, ok := route.CustomRoutes[backendName]; ok {
8989
delete(route.CustomRoutes, backendName)
@@ -114,11 +114,11 @@ func (c *HAProxyController) setDefaultService(ingress *store.Ingress, frontends
114114
if frontend.Mode == "tcp" {
115115
tcpService = true
116116
}
117-
svc, err := service.NewCtx(c.Store, ingress, ingress.DefaultBackend, c.Cfg.Certificates, tcpService)
117+
svc, err := service.New(c.Store, ingress.DefaultBackend, c.Cfg.Certificates, tcpService, ingress.Annotations, c.Store.ConfigMaps.Main.Annotations)
118118
if err != nil {
119119
return
120120
}
121-
if svc.GetStatus() == DELETED {
121+
if ingress.DefaultBackend.Status == DELETED {
122122
return
123123
}
124124
bdReload, err := svc.HandleBackend(c.Client, c.Store)

controller/service/endpoints.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ import (
2626
)
2727

2828
// HandleHAProxySrvs handles the haproxy backend servers of the corresponding IngressPath (service + port)
29-
func (s *SvcContext) HandleHAProxySrvs(client api.HAProxyClient, store store.K8s) (reload bool) {
29+
func (s *Service) HandleHAProxySrvs(client api.HAProxyClient, store store.K8s) (reload bool) {
3030
var srvsScaled bool
3131
backend, err := s.getRuntimeBackend(store)
3232
if err != nil {
33-
logger.Warningf("Ingress '%s/%s': %s", s.ingress.Namespace, s.ingress.Name, err)
33+
logger.Warningf("Ingress '%s/%s': %s", s.resource.Namespace, s.resource.Name, err)
3434
if servers, _ := client.BackendServersGet(s.backend.Name); servers != nil {
3535
client.BackendServerDeleteAll(s.backend.Name)
3636
}
3737
return
3838
}
3939
backend.Name = s.backend.Name // set backendName in store.PortEndpoints for runtime updates.
4040
// scale servers
41-
if s.service.DNS == "" {
41+
if s.resource.DNS == "" {
4242
srvsScaled = s.scaleHAProxySrvs(backend, store)
4343
}
4444
// update servers
@@ -55,7 +55,7 @@ func (s *SvcContext) HandleHAProxySrvs(client api.HAProxyClient, store store.K8s
5555
}
5656

5757
// updateHAProxySrv updates corresponding HAProxy backend server or creates one if it does not exist
58-
func (s *SvcContext) updateHAProxySrv(client api.HAProxyClient, srvSlot store.HAProxySrv, port int64) {
58+
func (s *Service) updateHAProxySrv(client api.HAProxyClient, srvSlot store.HAProxySrv, port int64) {
5959
srv := models.Server{
6060
Name: srvSlot.Name,
6161
Port: &port,
@@ -85,7 +85,7 @@ func (s *SvcContext) updateHAProxySrv(client api.HAProxyClient, srvSlot store.HA
8585
}
8686

8787
// scaleHAproxySrvs adds servers to match available addresses
88-
func (s *SvcContext) scaleHAProxySrvs(backend *store.RuntimeBackend, k8sStore store.K8s) (reload bool) {
88+
func (s *Service) scaleHAProxySrvs(backend *store.RuntimeBackend, k8sStore store.K8s) (reload bool) {
8989
var flag bool
9090
var disabled []*store.HAProxySrv
9191
var annVal int
@@ -142,17 +142,17 @@ func (s *SvcContext) scaleHAProxySrvs(backend *store.RuntimeBackend, k8sStore st
142142
return reload
143143
}
144144

145-
func (s *SvcContext) getRuntimeBackend(k8s store.K8s) (backend *store.RuntimeBackend, err error) {
145+
func (s *Service) getRuntimeBackend(k8s store.K8s) (backend *store.RuntimeBackend, err error) {
146146
var ok bool
147147
var backends map[string]*store.RuntimeBackend
148-
if ns := k8s.Namespaces[s.service.Namespace]; ns != nil {
149-
backends, ok = ns.HAProxyRuntime[s.service.Name]
148+
if ns := k8s.Namespaces[s.resource.Namespace]; ns != nil {
149+
backends, ok = ns.HAProxyRuntime[s.resource.Name]
150150
}
151151
if !ok {
152-
if s.service.DNS != "" {
152+
if s.resource.DNS != "" {
153153
return s.getExternalNameEndpoints()
154154
}
155-
return nil, fmt.Errorf("no Endpoints for service '%s'", s.service.Name)
155+
return nil, fmt.Errorf("no available endpoints")
156156
}
157157
sp := s.path.SvcPortResolved
158158
if sp != nil {
@@ -163,15 +163,15 @@ func (s *SvcContext) getRuntimeBackend(k8s store.K8s) (backend *store.RuntimeBac
163163
}
164164
}
165165
if s.path.SvcPortString != "" {
166-
return nil, fmt.Errorf("no matching endpoints for service '%s' and port '%s'", s.service.Name, s.path.SvcPortString)
166+
return nil, fmt.Errorf("no matching endpoints for port '%s'", s.path.SvcPortString)
167167
}
168-
return nil, fmt.Errorf("no matching endpoints for service '%s' and port '%d'", s.service.Name, s.path.SvcPortInt)
168+
return nil, fmt.Errorf("no matching endpoints for port '%d'", s.path.SvcPortInt)
169169
}
170170

171-
func (s *SvcContext) getExternalNameEndpoints() (endpoints *store.RuntimeBackend, err error) {
172-
logger.Tracef("Configuring service '%s', of type ExternalName", s.service.Name)
171+
func (s *Service) getExternalNameEndpoints() (endpoints *store.RuntimeBackend, err error) {
172+
logger.Tracef("Configuring service '%s', of type ExternalName", s.resource.Name)
173173
var port int64
174-
for _, sp := range s.service.Ports {
174+
for _, sp := range s.resource.Ports {
175175
if sp.Name == s.path.SvcPortString || sp.Port == s.path.SvcPortInt {
176176
port = sp.Port
177177
}
@@ -181,14 +181,14 @@ func (s *SvcContext) getExternalNameEndpoints() (endpoints *store.RuntimeBackend
181181
if s.path.SvcPortInt != 0 {
182182
ingressPort = fmt.Sprintf("%d", s.path.SvcPortInt)
183183
}
184-
return nil, fmt.Errorf("service '%s': service port '%s' not found", s.service.Name, ingressPort)
184+
return nil, fmt.Errorf("service '%s': service port '%s' not found", s.resource.Name, ingressPort)
185185
}
186186
endpoints = &store.RuntimeBackend{
187187
Endpoints: store.PortEndpoints{Port: port},
188188
HAProxySrvs: []*store.HAProxySrv{
189189
{
190190
Name: "SRV_1",
191-
Address: s.service.DNS,
191+
Address: s.resource.DNS,
192192
Modified: true,
193193
},
194194
},

controller/service/service.go

Lines changed: 41 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -31,56 +31,49 @@ import (
3131

3232
var logger = utils.GetLogger()
3333

34-
type SvcContext struct {
35-
store store.K8s
36-
ingress *store.Ingress
37-
path *store.IngressPath
38-
service *store.Service
39-
backend *models.Backend
40-
certs *certs.Certificates
41-
modeTCP bool
42-
newBackend bool
34+
type Service struct {
35+
path *store.IngressPath
36+
resource *store.Service
37+
backend *models.Backend
38+
certs *certs.Certificates
39+
annotations []map[string]string
40+
modeTCP bool
41+
newBackend bool
4342
}
4443

45-
func NewCtx(k8s store.K8s, ingress *store.Ingress, path *store.IngressPath, certs *certs.Certificates, tcpService bool) (*SvcContext, error) {
46-
service, err := getService(k8s, ingress.Namespace, path.SvcName)
44+
// New returns a Service instance to handle the k8s IngressPath resource given in params.
45+
// An error will be returned if there is no k8s Service resource corresponding to the service description in IngressPath.
46+
func New(k store.K8s, path *store.IngressPath, certs *certs.Certificates, tcpService bool, annList ...map[string]string) (*Service, error) {
47+
service, err := k.GetService(path.SvcNamespace, path.SvcName)
4748
if err != nil {
4849
return nil, err
4950
}
50-
return &SvcContext{
51-
store: k8s,
52-
ingress: ingress,
53-
path: path,
54-
service: service,
55-
certs: certs,
56-
modeTCP: tcpService,
51+
a := make([]map[string]string, 1, 3)
52+
a[0] = service.Annotations
53+
a = append(a, annList...)
54+
return &Service{
55+
path: path,
56+
resource: service,
57+
certs: certs,
58+
annotations: a,
59+
modeTCP: tcpService,
5760
}, nil
5861
}
5962

60-
func (s *SvcContext) GetStatus() store.Status {
61-
if s.path.Status == store.DELETED || s.service.Status == store.DELETED {
62-
return store.DELETED
63-
}
64-
if s.path.Status == store.EMPTY {
65-
return s.service.Status
66-
}
67-
return s.path.Status
68-
}
69-
70-
func (s *SvcContext) GetService() *store.Service {
71-
return s.service
63+
func (s *Service) GetResource() *store.Service {
64+
return s.resource
7265
}
7366

7467
// GetBackendName checks if servicePort provided in IngressPath exists and construct corresponding backend name
75-
// Backend name is in format "ServiceNS-ServiceName-PortName"
76-
func (s *SvcContext) GetBackendName() (name string, err error) {
68+
// Backend name is in format "ServiceNS_ServiceName_PortName"
69+
func (s *Service) GetBackendName() (name string, err error) {
7770
if s.backend != nil && s.backend.Name != "" {
7871
name = s.backend.Name
7972
return
8073
}
8174
var svcPort store.ServicePort
8275
found := false
83-
for _, sp := range s.service.Ports {
76+
for _, sp := range s.resource.Ports {
8477
if (sp.Port == s.path.SvcPortInt) ||
8578
(sp.Name != "" && sp.Name == s.path.SvcPortString) {
8679
svcPort = sp
@@ -90,23 +83,23 @@ func (s *SvcContext) GetBackendName() (name string, err error) {
9083
}
9184
if !found {
9285
if s.path.SvcPortString != "" {
93-
err = fmt.Errorf("service %s: no service port matching '%s'", s.service.Name, s.path.SvcPortString)
86+
err = fmt.Errorf("service %s: no service port matching '%s'", s.resource.Name, s.path.SvcPortString)
9487
} else {
95-
err = fmt.Errorf("service %s: no service port matching '%d'", s.service.Name, s.path.SvcPortInt)
88+
err = fmt.Errorf("service %s: no service port matching '%d'", s.resource.Name, s.path.SvcPortInt)
9689
}
9790
return
9891
}
9992
s.path.SvcPortResolved = &svcPort
10093
if svcPort.Name != "" {
101-
name = fmt.Sprintf("%s_%s_%s", s.service.Namespace, s.service.Name, svcPort.Name)
94+
name = fmt.Sprintf("%s_%s_%s", s.resource.Namespace, s.resource.Name, svcPort.Name)
10295
} else {
103-
name = fmt.Sprintf("%s_%s_%s", s.service.Namespace, s.service.Name, strconv.Itoa(int(svcPort.Port)))
96+
name = fmt.Sprintf("%s_%s_%s", s.resource.Namespace, s.resource.Name, strconv.Itoa(int(svcPort.Port)))
10497
}
10598
return
10699
}
107100

108-
// HandleBackend processes a Service Context and creates/updates corresponding backend configuration in HAProxy
109-
func (s *SvcContext) HandleBackend(client api.HAProxyClient, store store.K8s) (reload bool, err error) {
101+
// HandleBackend processes a Service and creates/updates corresponding backend configuration in HAProxy
102+
func (s *Service) HandleBackend(client api.HAProxyClient, store store.K8s) (reload bool, err error) {
110103
var backend, newBackend *models.Backend
111104
newBackend, err = s.getBackendModel(store)
112105
s.backend = newBackend
@@ -123,44 +116,44 @@ func (s *SvcContext) HandleBackend(client api.HAProxyClient, store store.K8s) (r
123116
return
124117
}
125118
reload = true
126-
logger.Debugf("Ingress '%s/%s': backend '%s' updated: %s\nReload required", s.ingress.Namespace, s.ingress.Name, newBackend.Name, result)
119+
logger.Debugf("Service '%s/%s': backend '%s' updated: %s\nReload required", s.resource.Namespace, s.resource.Name, newBackend.Name, result)
127120
}
128121
} else {
129122
if err = client.BackendCreate(*newBackend); err != nil {
130123
return
131124
}
132125
s.newBackend = true
133126
reload = true
134-
logger.Debugf("Ingress '%s/%s': new backend '%s', reload required", s.ingress.Namespace, s.ingress.Name, newBackend.Name)
127+
logger.Debugf("Service '%s/%s': new backend '%s', reload required", s.resource.Namespace, s.resource.Name, newBackend.Name)
135128
}
136129
// config-snippet
137-
logger.Error(annotations.NewBackendCfgSnippet("backend-config-snippet", newBackend.Name).Process(store, s.service.Annotations, s.ingress.Annotations, store.ConfigMaps.Main.Annotations))
130+
logger.Error(annotations.NewBackendCfgSnippet("backend-config-snippet", newBackend.Name).Process(store, s.annotations...))
138131
change, errSnipp := annotations.UpdateBackendCfgSnippet(client, newBackend.Name)
139132
logger.Error(errSnipp)
140133
if len(change) != 0 {
141134
reload = true
142-
logger.Debugf("Ingress '%s/%s': backend '%s' updated: %s\nReload required", s.ingress.Namespace, s.ingress.Name, newBackend.Name, change)
135+
logger.Debugf("Service '%s/%s': backend '%s' config-snippet updated: %s\nReload required", s.resource.Namespace, s.resource.Name, newBackend.Name, change)
143136
}
144137
return
145138
}
146139

147140
// getBackendModel checks for a corresponding custom resource before falling back to annoations
148-
func (s *SvcContext) getBackendModel(store store.K8s) (*models.Backend, error) {
141+
func (s *Service) getBackendModel(store store.K8s) (*models.Backend, error) {
149142
var backend *models.Backend
150143
var err error
151144
var cookieKey = "ohph7OoGhong"
152145
crInuse := true
153-
backend, err = annotations.ModelBackend("cr-backend", s.service.Namespace, store, s.service.Annotations, s.ingress.Annotations, store.ConfigMaps.Main.Annotations)
146+
backend, err = annotations.ModelBackend("cr-backend", s.resource.Namespace, store, s.annotations...)
154147
logger.Warning(err)
155148
if backend == nil {
156149
backend = &models.Backend{DefaultServer: &models.DefaultServer{}}
157150
crInuse = false
158151
}
159152
if !crInuse {
160153
for _, a := range annotations.Backend(backend, store, s.certs) {
161-
err = a.Process(store, s.service.Annotations, s.ingress.Annotations, store.ConfigMaps.Main.Annotations)
154+
err = a.Process(store, s.annotations...)
162155
if err != nil {
163-
logger.Errorf("service '%s/%s': annotation '%s': %s", s.service.Namespace, s.service.Name, a.GetName(), err)
156+
logger.Errorf("service '%s/%s': annotation '%s': %s", s.resource.Namespace, s.resource.Name, a.GetName(), err)
164157
}
165158
}
166159
}
@@ -172,24 +165,11 @@ func (s *SvcContext) getBackendModel(store store.K8s) (*models.Backend, error) {
172165
if backend.Name, err = s.GetBackendName(); err != nil {
173166
return nil, err
174167
}
175-
if s.service.DNS != "" {
168+
if s.resource.DNS != "" {
176169
backend.DefaultServer = &models.DefaultServer{InitAddr: "last,libc,none"}
177170
}
178171
if backend.Cookie != nil && backend.Cookie.Dynamic && backend.DynamicCookieKey == "" {
179172
backend.DynamicCookieKey = cookieKey
180173
}
181174
return backend, nil
182175
}
183-
184-
func getService(k8s store.K8s, namespace, name string) (*store.Service, error) {
185-
var service *store.Service
186-
ns, ok := k8s.Namespaces[namespace]
187-
if !ok {
188-
return nil, fmt.Errorf("service '%s/%s' namespace not found", namespace, name)
189-
}
190-
service, ok = ns.Services[name]
191-
if !ok {
192-
return nil, fmt.Errorf("service '%s/%s' not found", namespace, name)
193-
}
194-
return service, nil
195-
}

controller/store/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func (n ingressNetworkingV1Beta1Strategy) ConvertIngress() *Ingress {
106106
paths[prefix+"-"+k8sPath.Path] = &IngressPath{
107107
Path: k8sPath.Path,
108108
PathTypeMatch: string(*k8sPath.PathType),
109+
SvcNamespace: n.ig.GetNamespace(),
109110
SvcName: k8sPath.Backend.ServiceName,
110111
SvcPortInt: int64(k8sPath.Backend.ServicePort.IntValue()),
111112
SvcPortString: k8sPath.Backend.ServicePort.StrVal,
@@ -131,6 +132,7 @@ func (n ingressNetworkingV1Beta1Strategy) ConvertIngress() *Ingress {
131132
return nil
132133
}
133134
return &IngressPath{
135+
SvcNamespace: n.ig.GetNamespace(),
134136
SvcName: ingressBackend.ServiceName,
135137
SvcPortInt: int64(ingressBackend.ServicePort.IntValue()),
136138
SvcPortString: ingressBackend.ServicePort.StrVal,

controller/store/types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ type IngressClass struct {
103103

104104
// IngressPath is useful data from k8s structures about ingress path
105105
type IngressPath struct {
106+
SvcNamespace string
106107
SvcName string
107108
SvcPortInt int64
108109
SvcPortString string

0 commit comments

Comments
 (0)