@@ -31,56 +31,49 @@ import (
31
31
32
32
var logger = utils .GetLogger ()
33
33
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
43
42
}
44
43
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 )
47
48
if err != nil {
48
49
return nil , err
49
50
}
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 ,
57
60
}, nil
58
61
}
59
62
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
72
65
}
73
66
74
67
// 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 ) {
77
70
if s .backend != nil && s .backend .Name != "" {
78
71
name = s .backend .Name
79
72
return
80
73
}
81
74
var svcPort store.ServicePort
82
75
found := false
83
- for _ , sp := range s .service .Ports {
76
+ for _ , sp := range s .resource .Ports {
84
77
if (sp .Port == s .path .SvcPortInt ) ||
85
78
(sp .Name != "" && sp .Name == s .path .SvcPortString ) {
86
79
svcPort = sp
@@ -90,23 +83,23 @@ func (s *SvcContext) GetBackendName() (name string, err error) {
90
83
}
91
84
if ! found {
92
85
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 )
94
87
} 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 )
96
89
}
97
90
return
98
91
}
99
92
s .path .SvcPortResolved = & svcPort
100
93
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 )
102
95
} 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 )))
104
97
}
105
98
return
106
99
}
107
100
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 ) {
110
103
var backend , newBackend * models.Backend
111
104
newBackend , err = s .getBackendModel (store )
112
105
s .backend = newBackend
@@ -123,44 +116,44 @@ func (s *SvcContext) HandleBackend(client api.HAProxyClient, store store.K8s) (r
123
116
return
124
117
}
125
118
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 )
127
120
}
128
121
} else {
129
122
if err = client .BackendCreate (* newBackend ); err != nil {
130
123
return
131
124
}
132
125
s .newBackend = true
133
126
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 )
135
128
}
136
129
// 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 ... ))
138
131
change , errSnipp := annotations .UpdateBackendCfgSnippet (client , newBackend .Name )
139
132
logger .Error (errSnipp )
140
133
if len (change ) != 0 {
141
134
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 )
143
136
}
144
137
return
145
138
}
146
139
147
140
// 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 ) {
149
142
var backend * models.Backend
150
143
var err error
151
144
var cookieKey = "ohph7OoGhong"
152
145
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 ... )
154
147
logger .Warning (err )
155
148
if backend == nil {
156
149
backend = & models.Backend {DefaultServer : & models.DefaultServer {}}
157
150
crInuse = false
158
151
}
159
152
if ! crInuse {
160
153
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 ... )
162
155
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 )
164
157
}
165
158
}
166
159
}
@@ -172,24 +165,11 @@ func (s *SvcContext) getBackendModel(store store.K8s) (*models.Backend, error) {
172
165
if backend .Name , err = s .GetBackendName (); err != nil {
173
166
return nil , err
174
167
}
175
- if s .service .DNS != "" {
168
+ if s .resource .DNS != "" {
176
169
backend .DefaultServer = & models.DefaultServer {InitAddr : "last,libc,none" }
177
170
}
178
171
if backend .Cookie != nil && backend .Cookie .Dynamic && backend .DynamicCookieKey == "" {
179
172
backend .DynamicCookieKey = cookieKey
180
173
}
181
174
return backend , nil
182
175
}
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