Skip to content

Commit 18dde7e

Browse files
author
Erki Aas
authored
Merge pull request #4 from codemowers/feat/ingress-mixin
feat: IngressMixin
2 parents 740c18f + d43b1fe commit 18dde7e

File tree

5 files changed

+100
-2
lines changed

5 files changed

+100
-2
lines changed

operatorlib.py

+63
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,13 @@ async def reconcile_instance(self):
614614
manifest["metadata"]["namespace"],
615615
manifest,
616616
_preload_content=False)
617+
status = await resp.json()
618+
if status["kind"] == "Status" and status["status"] == "Failure":
619+
print(" Failed to create %s %s/%s",
620+
manifest["kind"],
621+
manifest["metadata"]["namespace"],
622+
manifest["metadata"]["name"],
623+
"because:", status["message"])
617624
else:
618625
print(" Patching %s %s/%s" % (manifest["kind"], manifest["metadata"]["namespace"], manifest["metadata"]["name"]))
619626
resp = await getattr(k8s_api, "patch_namespaced_{0}".format(kind))(
@@ -1577,6 +1584,62 @@ def generate_manifests(self):
15771584
}] if self.class_spec.get("podSpec") else [])
15781585

15791586

1587+
class IngressMixin():
1588+
"""
1589+
Mixin for handling Ingress resource
1590+
"""
1591+
@classmethod
1592+
def generate_operator_cluster_role_rules(cls):
1593+
yield from super().generate_operator_cluster_role_rules()
1594+
yield "networking.k8s.io", "ingresses", ("get", "create", "patch")
1595+
1596+
def get_ingress_host(self):
1597+
return self.class_spec.get("ingressSpec").get("host") % (self.get_target_name())
1598+
1599+
def generate_ingress(self):
1600+
"""
1601+
Generate Kubernetes Ingress specification
1602+
"""
1603+
return {
1604+
"rules": [
1605+
{
1606+
"host": self.get_ingress_host(),
1607+
"http": {
1608+
"paths": [
1609+
{
1610+
"pathType": "Prefix",
1611+
"path": "/",
1612+
"backend": {
1613+
"service": {
1614+
"name": self.get_service_name(),
1615+
"port": {
1616+
"name": "http"
1617+
}
1618+
}
1619+
}
1620+
}
1621+
]
1622+
}
1623+
}
1624+
],
1625+
"tls": self.class_spec.get("ingressSpec").get("tls") if self.class_spec.get("ingressSpec").get("tls") else []
1626+
}
1627+
1628+
def generate_manifests(self):
1629+
return super().generate_manifests() + ([{
1630+
"kind": "Ingress",
1631+
"apiVersion": "networking.k8s.io/v1",
1632+
"metadata": {
1633+
"namespace": self.get_target_namespace(),
1634+
"name": self.get_service_name(),
1635+
"labels": self.labels,
1636+
"annotations": self.class_spec.get("ingressSpec").get("annotations") if self.class_spec.get("ingressSpec").get("annotations") else {},
1637+
"ownerReferences": [self.get_instance_owner()],
1638+
},
1639+
"spec": self.generate_ingress(),
1640+
}] if self.class_spec.get("ingressSpec") else [])
1641+
1642+
15801643
class PrimarySecondaryMixin():
15811644
"""
15821645
Mixin for handling primary-secondary applications

samples/minio-bucket-operator/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ LABEL name="codemowers/minio-operator" \
1414
version="rc" \
1515
maintainer="Lauri Võsandi <[email protected]>"
1616
ENV PYTHONUNBUFFERED=1
17-
ENTRYPOINT /app/minio_bucket_operator.py run
17+
ENTRYPOINT python3 /app/minio_bucket_operator.py run
1818
ADD operatorlib.py /app/
1919
ADD samples/minio-bucket-operator/minio-owner.json /app/
2020
ADD samples/minio-bucket-operator/minio_bucket_operator.py /app/

samples/minio-bucket-operator/minio_bucket_operator.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
ConsoleMixin, \
2323
HeadlessMixin, \
2424
ServiceMixin, \
25+
IngressMixin, \
2526
InstanceSecretMixin, \
2627
ClaimSecretMixin, \
2728
ClassedOperator
@@ -42,6 +43,7 @@ class MinioBucketOperator(SharedMixin,
4243
ConsoleMixin,
4344
HeadlessMixin,
4445
ServiceMixin,
46+
IngressMixin,
4547
InstanceSecretMixin,
4648
ClaimSecretMixin,
4749
ClassedOperator):
@@ -109,7 +111,7 @@ def get_bucket_name(self):
109111
return "%s-%s" % (self.spec["claimRef"]["namespace"], self.uid)
110112

111113
def get_s3_endpoint_url(self):
112-
return self.instance_secret.get(
114+
return "https://%s" % self.get_ingress_host() if self.class_spec.get("ingressSpec") else self.instance_secret.get(
113115
"AWS_S3_ENDPOINT_URL", "http://%s" % self.get_service_fqdn())
114116

115117
def get_minio_admin_uri(self):

samples/minio-bucket-operator/templates/minio-bucket-operator-crds.yaml

+25
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,31 @@ spec:
246246
type: object
247247
type: array
248248
type: object
249+
ingressSpec:
250+
properties:
251+
host:
252+
type: string
253+
ingressClassName:
254+
type: string
255+
annotations:
256+
type: object
257+
x-kubernetes-embedded-resource: false
258+
x-kubernetes-preserve-unknown-fields: true
259+
tls:
260+
items:
261+
properties:
262+
hosts:
263+
type: array
264+
items:
265+
default: ""
266+
type: string
267+
secretName:
268+
type: string
269+
type: object
270+
type: array
271+
required:
272+
- host
273+
type: object
249274
reclaimPolicy:
250275
enum:
251276
- Retain

samples/minio-bucket-operator/templates/minio-bucket-operator-rbac.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ rules:
2727
- create
2828
- get
2929
- patch
30+
- apiGroups:
31+
- networking.k8s.io
32+
resources:
33+
- ingresses
34+
verbs:
35+
- create
36+
- get
37+
- patch
3038
- apiGroups:
3139
- apps
3240
resources:

0 commit comments

Comments
 (0)