@@ -31,56 +31,49 @@ import (
3131
3232var 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\n Reload required" , s .ingress .Namespace , s .ingress .Name , newBackend .Name , result )
119+ logger .Debugf ("Service '%s/%s': backend '%s' updated: %s\n Reload 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\n Reload required" , s .ingress .Namespace , s .ingress .Name , newBackend .Name , change )
135+ logger .Debugf ("Service '%s/%s': backend '%s' config-snippet updated: %s\n Reload 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- }
0 commit comments