Skip to content
Open
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
8 changes: 5 additions & 3 deletions helm/blueapi/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ A Helm chart deploying a worker pod that runs Bluesky plans
| podLabels | object | `{}` | |
| podSecurityContext | object | `{}` | |
| readinessProbe | object | `{"failureThreshold":2,"httpGet":{"path":"/healthz","port":"http"},"periodSeconds":10}` | Readiness probe, if configured kubernetes will not route traffic to this pod if failed consecutively. This could allow the service time to recover if it is being overwhelmed by traffic, but without the to ability to load balance or scale up/outwards, upstream services will need to know to back off. This is automatically disabled when in debug mode. |
| resources | object | `{"limits":{"cpu":"2000m","memory":"4000Mi"},"requests":{"cpu":"200m","memory":"400Mi"}}` | Sets the compute resources available to the pod. These defaults are appropriate when using debug mode or an internal PVC and therefore running VS Code server in the pod. In the Diamond cluster, requests must be >= 0.1*limits When not using either of the above, the limits may be lowered. When idle but connected, blueapi consumes ~400MB of memory and 1% cpu and may struggle when allocated less. |
| resources.limits.cpu | string | `"2000m"` | |
| resources.limits.memory | string | `"4000Mi"` | |
| resources.requests.cpu | string | `"200m"` | |
| resources.requests.memory | string | `"400Mi"` | |
| restartOnConfigChange | bool | `true` | If enabled the blueapi pod will restart on changes to `worker` |
| securityContext.runAsNonRoot | bool | `true` | |
| securityContext.runAsUser | int | `1000` | |
Expand All @@ -46,11 +49,10 @@ A Helm chart deploying a worker pod that runs Bluesky plans
| startupProbe | object | `{"failureThreshold":5,"httpGet":{"path":"/healthz","port":"http"},"periodSeconds":10}` | A more lenient livenessProbe to allow the service to start fully. This is automatically disabled when in debug mode. |
| tolerations | list | `[]` | May be required to run on specific nodes (e.g. the control machine) |
| tracing | object | `{"fastapi":{"excludedURLs":"/healthz"},"otlp":{"enabled":false,"protocol":"http/protobuf","server":{"host":"http://opentelemetry-collector.tracing","port":4318}}}` | Exclude health probe requests from tracing by default to prevent spamming |
| volumeMounts | list | `[{"mountPath":"/config","name":"worker-config","readOnly":true}]` | Additional volumeMounts on the output StatefulSet definition. Define how volumes are mounted to the container referenced by using the same name. |
| volumeMounts | list | `[]` | Additional volumeMounts on the output StatefulSet definition. Define how volumes are mounted to the container referenced by using the same name. |
| volumes | list | `[]` | Additional volumes on the output StatefulSet definition. Define volumes from e.g. Secrets, ConfigMaps or the Filesystem |
| worker | object | `{"api":{"url":"http://0.0.0.0:8000/"},"env":{"sources":[{"kind":"planFunctions","module":"dodal.plans"},{"kind":"planFunctions","module":"dodal.plan_stubs.wrapped"}]},"logging":{"graylog":{"enabled":false,"url":"tcp://graylog-log-target.diamond.ac.uk:12231/"},"level":"INFO"},"scratch":{"repositories":[],"root":"/workspace"},"stomp":{"auth":{"password":"guest","username":"guest"},"enabled":false,"url":"tcp://rabbitmq:61613/"}}` | Config for the worker goes here, will be mounted into a config file |
| worker.api.url | string | `"http://0.0.0.0:8000/"` | 0.0.0.0 required to allow non-loopback traffic If using hostNetwork, the port must be free on the host |
| worker.env.sources | list | `[{"kind":"planFunctions","module":"dodal.plans"},{"kind":"planFunctions","module":"dodal.plan_stubs.wrapped"}]` | modules (must be installed in the venv) to fetch devices/plans from |
| worker.logging | object | `{"graylog":{"enabled":false,"url":"tcp://graylog-log-target.diamond.ac.uk:12231/"},"level":"INFO"}` | Configures logging. Port 12231 is the `dodal` input on graylog which will be renamed `blueapi` |
| worker.scratch | object | `{"repositories":[],"root":"/workspace"}` | If initContainer is enabled the default branch of python projects in this section are installed into the venv *without their dependencies* |
| worker.stomp | object | `{"auth":{"password":"guest","username":"guest"},"enabled":false,"url":"tcp://rabbitmq:61613/"}` | Message bus configuration for returning status to GDA/forwarding documents downstream Password may be in the form ${ENV_VAR} to be fetched from an environment variable e.g. mounted from a SealedSecret |
3 changes: 3 additions & 0 deletions helm/blueapi/templates/statefulset.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ spec:
{{- toYaml . | nindent 12 }}
{{- end }}
volumeMounts:
- name: worker-config
mountPath: "/config"
readOnly: true
{{- with .Values.volumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
Expand Down
18 changes: 1 addition & 17 deletions helm/blueapi/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,6 @@
}
},
"resources": {
"description": "Sets the compute resources available to the pod. These defaults are appropriate when using debug mode or an internal PVC and therefore running VS Code server in the pod. In the Diamond cluster, requests must be \u003e= 0.1*limits When not using either of the above, the limits may be lowered. When idle but connected, blueapi consumes ~400MB of memory and 1% cpu and may struggle when allocated less.",
"type": "object",
"properties": {
"limits": {
Expand Down Expand Up @@ -334,21 +333,7 @@
},
"volumeMounts": {
"description": "Additional volumeMounts on the output StatefulSet definition. Define how volumes are mounted to the container referenced by using the same name.",
"type": "array",
"items": {
"type": "object",
"properties": {
"mountPath": {
"type": "string"
},
"name": {
"type": "string"
},
"readOnly": {
"type": "boolean"
}
}
}
"type": "array"
},
"volumes": {
"description": "Additional volumes on the output StatefulSet definition. Define volumes from e.g. Secrets, ConfigMaps or the Filesystem",
Expand Down Expand Up @@ -389,7 +374,6 @@
}
},
"logging": {
"description": "Configures logging. Port 12231 is the `dodal` input on graylog which will be renamed `blueapi`",
"type": "object",
"properties": {
"graylog": {
Expand Down
26 changes: 11 additions & 15 deletions helm/blueapi/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ podAnnotations: {}
# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
podLabels: {}

podSecurityContext: {}
# fsGroup: 2000
podSecurityContext: {} # fsGroup: 2000

securityContext:
# https://github.com/DiamondLightSource/blueapi/issues/1096
Expand All @@ -48,7 +47,7 @@ securityContext:
# drop:
# - ALL

# This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
# This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
service:
# This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
# -- To make blueapi available on an IP outside of the cluster prior to an Ingress being created, change this to LoadBalancer
Expand Down Expand Up @@ -76,13 +75,13 @@ ingress:
# hosts:
# - chart-example.local

# -- Sets the compute resources available to the pod.
# These defaults are appropriate when using debug mode or an internal PVC and therefore
# running VS Code server in the pod.
# In the Diamond cluster, requests must be >= 0.1*limits
# When not using either of the above, the limits may be lowered.
# When idle but connected, blueapi consumes ~400MB of memory and 1% cpu
# and may struggle when allocated less.
# -- Sets the compute resources available to the pod.
# These defaults are appropriate when using debug mode or an internal PVC and therefore
# running VS Code server in the pod.
# In the Diamond cluster, requests must be >= 0.1*limits
# When not using either of the above, the limits may be lowered.
# When idle but connected, blueapi consumes ~400MB of memory and 1% cpu
# and may struggle when allocated less.
resources:
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
Expand Down Expand Up @@ -134,10 +133,7 @@ volumes: []

# -- Additional volumeMounts on the output StatefulSet definition.
# Define how volumes are mounted to the container referenced by using the same name.
volumeMounts:
- name: worker-config
mountPath: "/config"
readOnly: true
volumeMounts: []

# -- May be required to run on specific nodes (e.g. the control machine)
nodeSelector: {}
Expand Down Expand Up @@ -205,7 +201,7 @@ worker:
repositories: []
# - name: "dodal"
# remote_url: https://github.com/DiamondLightSource/dodal.git
# -- Configures logging. Port 12231 is the `dodal` input on graylog which will be renamed `blueapi`
# -- Configures logging. Port 12231 is the `dodal` input on graylog which will be renamed `blueapi`
logging:
level: "INFO"
graylog:
Expand Down
13 changes: 9 additions & 4 deletions tests/unit_tests/test_helm_chart.py
Original file line number Diff line number Diff line change
Expand Up @@ -1206,7 +1206,7 @@ def test_service_linked_to_api(worker_api_url: str | None, service_port: int):

@pytest.mark.parametrize(
"added_mounts",
[[{"name": "worker-config", "mountPath": "/config", "readOnly": True}], [], None],
[[{"name": "foo", "mountPath": "/bar", "readOnly": True}], [], None],
)
@pytest.mark.parametrize(
"added_volumes", [[{"name": "foo", "configMap": {"name": "bar"}}], [], None]
Expand All @@ -1218,6 +1218,13 @@ def test_volumes_created(
manifests = render_chart(
values={"volumes": added_volumes, "volumeMounts": added_mounts}
)
expected_mounts = [
{
"name": "worker-config",
"mountPath": "/config",
"readOnly": True,
}
]

expected_volumes = [
{
Expand All @@ -1229,9 +1236,7 @@ def test_volumes_created(
if added_volumes:
expected_volumes += added_volumes
if added_mounts:
expected_mounts = added_mounts
else:
expected_mounts = None
expected_mounts += added_mounts

container_mounts = manifests["StatefulSet"]["blueapi"]["spec"]["template"]["spec"][
"containers"
Expand Down
Loading