Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions helm/templates/metrics-credentials.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{{- if .Values.enablePrometheusMetrics -}}
apiVersion: secretgenerator.mittwald.de/v1alpha1
kind: StringSecret
metadata:
name: {{ include "poolboy.name" . }}-metrics-credentials
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
annotations:
secret-generator.v1.mittwald.de/type: basic-auth
spec:
forceRegenerate: false
data:
metrics_username: {{ .Values.metrics.username }}
fields:
- fieldName: metrics_password
encoding: "hex"
length: "32"
{{- end }}
9 changes: 8 additions & 1 deletion helm/templates/service-monitor.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: {{ include "poolboy.name" . }}-monitor
name: {{ include "poolboy.name" . }}-metrics
namespace: {{ include "poolboy.namespaceName" . }}
labels:
{{- include "poolboy.labels" . | nindent 4 }}
Expand All @@ -17,4 +17,11 @@ spec:
- port: metrics
interval: "30s"
path: /metrics
basicAuth:
username:
name: {{ include "poolboy.name" . }}-metrics-credentials
key: metrics_username
password:
name: {{ include "poolboy.name" . }}-metrics-credentials
key: metrics_password
{{- end }}
6 changes: 6 additions & 0 deletions helm/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,10 @@ tolerations: []
affinity: {}

clusterDomain: unknown

# Enable Prometheus metrics
enablePrometheusMetrics: true

# Metrics Credentials
metrics:
username: metrics
30 changes: 25 additions & 5 deletions operator/poolboy_k8s.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
import asyncio
from typing import List, Mapping

import inflection
import kopf
import kubernetes_asyncio

from typing import List, Mapping

from metrics.timer_decorator import async_timer
from poolboy import Poolboy

api_groups = {}

class KindNotFoundException(Exception):
pass

@async_timer(app="PoolboyK8s")
async def create_object(definition: Mapping) -> Mapping:
if '/' in definition['apiVersion']:
return await create_custom_object(definition)
else:
return await create_core_object(definition)

@async_timer(app="PoolboyK8s")
async def create_core_object(definition: Mapping) -> Mapping:
if 'namespace' in definition['metadata']:
return await create_namespaced_core_object(definition)
else:
return await create_cluster_core_object(definition)

@async_timer(app="PoolboyK8s")
async def create_custom_object(definition: Mapping) -> Mapping:
group, version = definition['apiVersion'].split('/')
plural = await kind_to_plural(group=group, kind=definition['kind'], version=version)
Expand All @@ -44,6 +46,7 @@ async def create_custom_object(definition: Mapping) -> Mapping:
version = version,
)

@async_timer(app="PoolboyK8s")
async def create_cluster_core_object(definition: Mapping) -> Mapping:
kind = definition['kind']
method = getattr(
Expand All @@ -54,6 +57,7 @@ async def create_cluster_core_object(definition: Mapping) -> Mapping:
await method(body=definition)
)

@async_timer(app="PoolboyK8s")
async def create_namespaced_core_object(definition: Mapping) -> Mapping:
kind = definition['kind']
namespace = definition['metadata']['namespace']
Expand All @@ -65,6 +69,7 @@ async def create_namespaced_core_object(definition: Mapping) -> Mapping:
await method(body=definition, namespace=namespace)
)

@async_timer(app="PoolboyK8s")
async def delete_core_object(
kind: str,
name: str,
Expand All @@ -82,6 +87,7 @@ async def delete_core_object(
name = name,
)

@async_timer(app="PoolboyK8s")
async def delete_cluster_core_object(
kind: str,
name: str,
Expand All @@ -94,6 +100,7 @@ async def delete_cluster_core_object(
await method(name=name)
)

@async_timer(app="PoolboyK8s")
async def delete_namespaced_core_object(
kind: str,
name: str,
Expand All @@ -107,6 +114,7 @@ async def delete_namespaced_core_object(
await method(name=name, namespace=namespace)
)

@async_timer(app="PoolboyK8s")
async def delete_custom_object(
group: str,
version: str,
Expand All @@ -131,6 +139,7 @@ async def delete_custom_object(
version = version,
)

@async_timer(app="PoolboyK8s")
async def delete_object(
api_version: str,
kind: str,
Expand All @@ -153,6 +162,7 @@ async def delete_object(
namespace = namespace
)

@async_timer(app="PoolboyK8s")
async def get_object(
api_version: str,
kind: str,
Expand All @@ -175,6 +185,7 @@ async def get_object(
namespace = namespace
)

@async_timer(app="PoolboyK8s")
async def get_core_object(
kind: str,
name: str,
Expand All @@ -192,6 +203,7 @@ async def get_core_object(
name = name,
)

@async_timer(app="PoolboyK8s")
async def get_cluster_core_object(
kind: str,
name: str,
Expand All @@ -204,6 +216,7 @@ async def get_cluster_core_object(
await method(name=name)
)

@async_timer(app="PoolboyK8s")
async def get_namespaced_core_object(
kind: str,
name: str,
Expand All @@ -217,6 +230,7 @@ async def get_namespaced_core_object(
await method(name=name, namespace=namespace)
)

@async_timer(app="PoolboyK8s")
async def get_custom_object(
group: str,
version: str,
Expand All @@ -241,6 +255,7 @@ async def get_custom_object(
version = version,
)

@async_timer(app="PoolboyK8s")
async def get_requester_from_namespace(namespace: str) -> tuple[Mapping|None, List[Mapping]|None]:
try:
namespace_obj = await Poolboy.core_v1_api.read_namespace(namespace)
Expand Down Expand Up @@ -290,7 +305,7 @@ async def get_requester_from_namespace(namespace: str) -> tuple[Mapping|None, Li

return user, identities


@async_timer(app="PoolboyK8s")
async def kind_to_plural(
group: str,
kind: str,
Expand Down Expand Up @@ -336,6 +351,7 @@ async def kind_to_plural(
delay=600
)

@async_timer(app="PoolboyK8s")
async def patch_core_object(
kind: str,
name: str,
Expand All @@ -356,6 +372,7 @@ async def patch_core_object(
patch = patch,
)

@async_timer(app="PoolboyK8s")
async def patch_cluster_core_object(
kind: str,
name: str,
Expand All @@ -373,6 +390,7 @@ async def patch_cluster_core_object(
)
)

@async_timer(app="PoolboyK8s")
async def patch_namespaced_core_object(
kind: str,
name: str,
Expand All @@ -392,6 +410,7 @@ async def patch_namespaced_core_object(
)
)

@async_timer(app="PoolboyK8s")
async def patch_custom_object(
group: str,
kind: str,
Expand Down Expand Up @@ -421,6 +440,7 @@ async def patch_custom_object(
_content_type = 'application/json-patch+json',
)

@async_timer(app="PoolboyK8s")
async def patch_object(
api_version: str,
kind: str,
Expand Down
13 changes: 8 additions & 5 deletions operator/poolboy_templating.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import copy
import functools
import jinja2
import jmespath
import json
import pytimeparse
import random
import re

from datetime import datetime, timedelta, timezone
from strgen import StringGenerator

import jinja2
import jmespath
import pytimeparse
from metrics.timer_decorator import sync_timer
from str2bool import str2bool
from strgen import StringGenerator

MAX_RECURSION_DEPTH = 100

Expand Down Expand Up @@ -183,6 +184,8 @@ def j2template_get(template: str):
j2template_cache[template] = j2template
return j2template


@sync_timer(app="Jinja2Process")
def jinja2process(template, omit=None, variables={}, template_variables={}):
variables = copy.copy(variables)
variables['datetime'] = datetime
Expand Down