Skip to content

Commit 567fef8

Browse files
authored
Merge pull request #10 from nuvolaris/fix/pykube-ng-kopf-runtime
Support Traefik middleware compatibility across API groups
2 parents e27b916 + 2fb33a9 commit 567fef8

10 files changed

Lines changed: 67 additions & 19 deletions

File tree

deploy/nuvolaris-permissions/operator-roles.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ rules:
8383
verbs: ["get","patch","list","update","watch","create","delete"]
8484

8585
# required for traefik middlewares
86+
- apiGroups: ["traefik.containo.us"]
87+
resources: ["middlewares"]
88+
verbs: ["get","patch","list","update","watch","create","delete"]
89+
8690
- apiGroups: ["traefik.io"]
8791
resources: ["middlewares"]
8892
verbs: ["get","patch","list","update","watch","create","delete"]

nuvolaris/endpoint.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,12 @@ def delete(owner=None):
240240
return res
241241

242242
if(ingress_class == 'traefik'):
243-
res = kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost"))
244-
res += kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost-my"))
245-
res += kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost-info"))
243+
middleware_resource = util.get_traefik_middleware_resource()
244+
res = kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost"))
245+
res += kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost-my"))
246+
res += kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost-info"))
246247
if should_delete_www:
247-
res += kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost-www-my"))
248+
res += kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost-www-my"))
248249

249250
res += kube.kubectl("delete", "ingress",api_ingress_name(namespace,"apihost"))
250251
res += kube.kubectl("delete", "ingress",api_ingress_name(namespace,"apihost-my"))
@@ -321,8 +322,9 @@ def delete_ow_api_endpoint(ucfg):
321322
return res
322323

323324
if(ingress_class == 'traefik'):
324-
res += kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost"))
325-
res += kube.kubectl("delete", "middleware.traefik.io",api_middleware_ingress_name(namespace,"apihost-my"))
325+
middleware_resource = util.get_traefik_middleware_resource()
326+
res += kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost"))
327+
res += kube.kubectl("delete", middleware_resource,api_middleware_ingress_name(namespace,"apihost-my"))
326328

327329
res += kube.kubectl("delete", "ingress",api_ingress_name(namespace,"apihost"))
328330
res += kube.kubectl("delete", "ingress",api_ingress_name(namespace,"apihost-my"))

nuvolaris/ingress_data.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ def __init__(self, apihost):
4141
"hostname":hostname,
4242
"tls":tls,
4343
"ingress_class":ingress_class,
44+
"traefik_middleware_api_version": util.get_traefik_middleware_api_version(),
4445
"path_type":path_type,
4546
"route_timeout_seconds":tutil.duration_in_second(util.get_controller_http_timeout()),
4647
'needs_rewrite': False,
@@ -121,4 +122,4 @@ def render_traefik_middleware_template(self, namespace,tpl="traefik-middleware-t
121122
logging.info(f"*** Rendering traefik middleware template using host {self._data['hostname']} endpoint for {self._data['ingress_name']} via template {tpl}")
122123
out = f"/tmp/__{namespace}_{tpl}"
123124
file = ntp.spool_template(tpl, out, self._data)
124-
return os.path.abspath(file)
125+
return os.path.abspath(file)

nuvolaris/minio_ingress.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def delete_minio_ingress(runtime, namespace, ingress_class, type, owner=None):
203203
res += kube.kubectl("delete", "ingress",endpoint.api_ingress_name(namespace,type))
204204

205205
if(ingress_class == 'traefik'):
206-
res = kube.kubectl("delete", "middleware.traefik.io",endpoint.api_middleware_ingress_name(namespace,type))
206+
res = kube.kubectl("delete", util.get_traefik_middleware_resource(),endpoint.api_middleware_ingress_name(namespace,type))
207207

208208
return res
209209
except Exception as e:
@@ -223,4 +223,4 @@ def delete_minio_ingresses(data, owner=None):
223223
if data['minio_console_ingress_enabled']:
224224
res += delete_minio_ingress(runtime, namespace, ingress_class, "minio-console", owner)
225225

226-
return res
226+
return res

nuvolaris/registry_deploy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def delete_registry_ingress(owner=None, namespace="nuvolaris"):
221221
res += kube.kubectl("delete", "ingress",endpoint.api_ingress_name(namespace,"registry"))
222222

223223
if(ingress_class == 'traefik'):
224-
res = kube.kubectl("delete", "middleware.traefik.io",endpoint.api_middleware_ingress_name(namespace,"registry"))
224+
res = kube.kubectl("delete", util.get_traefik_middleware_resource(),endpoint.api_middleware_ingress_name(namespace,"registry"))
225225

226226
return res
227227
except Exception as e:

nuvolaris/seaweedfs_ingress.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def delete_seaweedfs_ingress(runtime, namespace, ingress_class, type, owner=None
151151
res += kube.kubectl("delete", "ingress",endpoint.api_ingress_name(namespace,type))
152152

153153
if(ingress_class == 'traefik'):
154-
res = kube.kubectl("delete", "middleware.traefik.io",endpoint.api_middleware_ingress_name(namespace,type))
154+
res = kube.kubectl("delete", util.get_traefik_middleware_resource(),endpoint.api_middleware_ingress_name(namespace,type))
155155

156156
return res
157157
except Exception as e:
@@ -170,4 +170,4 @@ def delete_seaweedfs_ingresses(data, owner=None):
170170
if data['seaweedfs_console_ingress_enabled']:
171171
res += delete_seaweedfs_ingress(runtime, namespace, ingress_class, "seaweedfs-filer", owner)
172172

173-
return res
173+
return res

nuvolaris/storage_static.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def delete_ow_static_endpoint(ucfg):
177177

178178
if(ingress_class == 'traefik'):
179179
middleware_name = static_middleware_ingress_name(namespace)
180-
res += kube.kubectl("delete", "middleware.traefik.io",middleware_name)
180+
res += kube.kubectl("delete", util.get_traefik_middleware_resource(),middleware_name)
181181

182182
ingress_name = static_ingress_name(namespace)
183183
res += kube.kubectl("delete", "ingress",ingress_name)
@@ -221,11 +221,11 @@ def delete_nuv_ingresses():
221221

222222
if(ingress_class == 'traefik'):
223223
middleware_name = static_middleware_ingress_name("nuvolaris")
224-
res += kube.kubectl("delete", "middleware.traefik.io",middleware_name)
224+
res += kube.kubectl("delete", util.get_traefik_middleware_resource(),middleware_name)
225225

226226
if should_delete_www:
227227
middleware_name = static_middleware_ingress_name("www-nuvolaris")
228-
res += kube.kubectl("delete", "middleware.traefik.io",middleware_name)
228+
res += kube.kubectl("delete", util.get_traefik_middleware_resource(),middleware_name)
229229

230230
ingress_name = static_ingress_name("nuvolaris")
231231
res += kube.kubectl("delete", "ingress",ingress_name)
@@ -264,4 +264,4 @@ def patch(status, action, owner=None):
264264
logging.info(f"*** hanlded request to {action} static")
265265
except Exception as e:
266266
logging.error('*** failed to update static: %s' % e)
267-
operator_util.patch_operator_status(status,'static','error')
267+
operator_util.patch_operator_status(status,'static','error')

nuvolaris/templates/traefik-middleware-tpl.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# under the License.
1717
#
1818
---
19-
apiVersion: traefik.io/v1alpha1
19+
apiVersion: {{traefik_middleware_api_version}}
2020
kind: Middleware
2121
metadata:
2222
namespace: {{namespace}}
@@ -30,4 +30,4 @@ spec:
3030
replacePathRegex:
3131
regex: {{context_path}}{{context_regexp}}
3232
replacement: {{rewrite_target}}
33-
{% endif %}
33+
{% endif %}

nuvolaris/util.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,31 @@ def get_ingress_class(runtime):
189189

190190
return ingress_class
191191

192+
def get_traefik_middleware_api_version():
193+
"""
194+
Detect the Traefik Middleware apiVersion supported by the current cluster.
195+
Prefer the new group `traefik.io`, while keeping compatibility with the
196+
historical `traefik.containo.us` CRDs.
197+
"""
198+
candidates = [
199+
("middlewares.traefik.io", "traefik.io/v1alpha1"),
200+
("middlewares.traefik.containo.us", "traefik.containo.us/v1alpha1"),
201+
]
202+
for crd_name, api_version in candidates:
203+
try:
204+
kube.kubectl("get", "crd", crd_name, namespace=None, debugresult=False)
205+
logging.info(f"detected Traefik middleware apiVersion {api_version} via CRD {crd_name}")
206+
return api_version
207+
except Exception:
208+
continue
209+
210+
logging.warning("could not auto-detect Traefik middleware CRD; defaulting to traefik.io/v1alpha1")
211+
return "traefik.io/v1alpha1"
212+
213+
def get_traefik_middleware_resource():
214+
api_group = get_traefik_middleware_api_version().split("/")[0]
215+
return f"middleware.{api_group}"
216+
192217
# determine the ingress-nginx flavour
193218
def get_ingress_yaml(runtime):
194219
if runtime == "eks":
@@ -907,4 +932,3 @@ def get_seaweedds_filer_host():
907932
seaweedfs_filer_host = cfg.get("seaweedfs.host", "SEAWEEDFS_API_HOST", "seaweedfs")
908933
seaweedfs_filer_port = cfg.get("seaweedfs.port", "SEAWEEDFS_API_PORT", "9090")
909934
return f"http://{seaweedfs_filer_host}:{seaweedfs_filer_port}"
910-

tests/auth.ipy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Licensed to the Apache Software Foundation (ASF) under one
2+
# or more contributor license agreements. See the NOTICE file
3+
# distributed with this work for additional information
4+
# regarding copyright ownership. The ASF licenses this file
5+
# to you under the Apache License, Version 2.0 (the
6+
# "License"); you may not use this file except in compliance
7+
# with the License. You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing,
12+
# software distributed under the License is distributed on an
13+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
# KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations
16+
# under the License.
17+
#

0 commit comments

Comments
 (0)