11from scheduler .exceptions import KubeHTTPException
22from scheduler .resources import Resource
33
4+ MANIFEAT_CLASSES = {}
5+
6+
7+ class BaseManifest (object ):
8+
9+ def manifest (self , ingress , ingress_class , namespace , ** kwargs ):
10+ path = "/*" if ingress_class in ("gce" , "alb" ) else "/"
11+ hosts , tls = kwargs .pop ("hosts" ), kwargs .pop ("tls" )
12+ data = {
13+ "kind" : "Ingress" ,
14+ "apiVersion" : "extensions/v1beta1" ,
15+ "metadata" : {
16+ "name" : ingress ,
17+ "annotations" : {
18+ "kubernetes.io/tls-acme" : "true" ,
19+ "kubernetes.io/ingress.class" : ingress_class
20+ }
21+ },
22+ "spec" : {
23+ "rules" : [{
24+ "host" : host ,
25+ "http" : {
26+ "paths" : [
27+ {
28+ "path" : path ,
29+ "backend" : {
30+ "serviceName" : ingress ,
31+ "servicePort" : 80
32+ }
33+ }
34+ ]
35+ }
36+ } for host in hosts ],
37+ "tls" : tls
38+ }
39+ }
40+ return data
41+ MANIFEAT_CLASSES ["default" ] = BaseManifest
42+
43+
44+ class NginxManifest (BaseManifest ):
45+
46+ def manifest (self , ingress , ingress_class , namespace , ** kwargs ):
47+ data = BaseManifest .manifest (
48+ self , ingress , ingress_class , namespace , ** kwargs )
49+ if "whitelist" in kwargs :
50+ whitelist = ", " .join (kwargs .pop ("whitelist" ))
51+ data .update ({
52+ "nginx.ingress.kubernetes.io/whitelist-source-range" : whitelist
53+ })
54+ if "ssl_redirect" in kwargs :
55+ ssl_redirect = kwargs .pop ("ssl_redirect" )
56+ data .update ({
57+ "nginx.ingress.kubernetes.io/ssl-redirect" : ssl_redirect
58+ })
59+ return data
60+ MANIFEAT_CLASSES ["nginx" ] = NginxManifest
61+
62+
63+ class TraefikManifest (BaseManifest ):
64+
65+ def manifest (self , ingress , ingress_class , namespace , ** kwargs ):
66+ data = BaseManifest .manifest (
67+ self , ingress , ingress_class , namespace , ** kwargs )
68+ if "whitelist" in kwargs :
69+ whitelist = ", " .join (kwargs .pop ("whitelist" ))
70+ data .update ({
71+ "ingress.kubernetes.io/whitelist-x-forwarded-for" : "true" ,
72+ "traefik.ingress.kubernetes.io/whitelist-source-range" : whitelist
73+ })
74+ if "ssl_redirect" in kwargs :
75+ ssl_redirect = kwargs .pop ("ssl_redirect" )
76+ data .update ({
77+ "ingress.kubernetes.io/ssl-redirect" : ssl_redirect
78+ })
79+ return data
80+ MANIFEAT_CLASSES ["traefik" ] = TraefikManifest
81+
482
583class Ingress (Resource ):
684 short_name = 'ingress'
785
86+ def manifest (self , ingress , ingress_class , namespace , ** kwargs ):
87+ if ingress_class not in MANIFEAT_CLASSES :
88+ ingress_class = "default"
89+ return MANIFEAT_CLASSES .get (ingress_class )().manifest (
90+ ingress , ingress_class , namespace , ** kwargs
91+ )
92+
893 def get (self , name = None , ** kwargs ):
994 """
1095 Fetch a single Ingress or a list of Ingresses
@@ -22,51 +107,30 @@ def get(self, name=None, **kwargs):
22107
23108 return response
24109
25- def create (self , ingress , ingress_class , namespace , hostname ):
110+ def create (self , ingress , ingress_class , namespace , ** kwargs ):
26111 url = "/apis/extensions/v1beta1/namespaces/%s/ingresses" % namespace
27- path = "/*" if ingress_class in ("gce" , "alb" ) else "/"
28- data = {
29- "kind" : "Ingress" ,
30- "apiVersion" : "extensions/v1beta1" ,
31- "metadata" : {
32- "name" : ingress ,
33- "annotations" : {
34- "kubernetes.io/tls-acme" : "true"
35- }
36- },
37- "spec" : {
38- "rules" : [
39- {
40- "host" : ingress + "." + hostname ,
41- "http" : {
42- "paths" : [
43- {
44- "path" : path ,
45- "backend" : {
46- "serviceName" : ingress ,
47- "servicePort" : 80
48- }
49- }
50- ]
51- }
52- }
53- ]
54- }
55- }
56- if ingress_class :
57- data ["metadata" ]["annotations" ].update ({
58- "kubernetes.io/ingress.class" : ingress_class })
112+ data = self .manifest (ingress , ingress_class , namespace , ** kwargs )
59113 response = self .http_post (url , json = data )
60114
61115 if not response .status_code == 201 :
62116 raise KubeHTTPException (response , "create Ingress {}" .format (namespace ))
63117
64118 return response
65119
120+ def update (self , ingress , ingress_class , namespace , ** kwargs ):
121+ url = "/apis/extensions/v1beta1/namespaces/%s/ingresses/%s" % (namespace , ingress )
122+ data = self .manifest (ingress , ingress_class , namespace , ** kwargs )
123+ response = self .http_put (url , json = data )
124+
125+ if self .unhealthy (response .status_code ):
126+ raise KubeHTTPException (response , "update Ingress {}" .format (namespace ))
127+
128+ return response
129+
66130 def delete (self , namespace , ingress ):
67131 url = "/apis/extensions/v1beta1/namespaces/%s/ingresses/%s" % (namespace , ingress )
68132 response = self .http_delete (url )
69133 if self .unhealthy (response .status_code ):
70134 raise KubeHTTPException (response , 'delete Ingress "{}"' , namespace )
71135
72- return response
136+ return response
0 commit comments