* staged first pass * black * Update litellm/proxy/health_check.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * simpler * restore cached logo * fix tests for perform_health_check max_concurrency arg * implement pr suggestion * and the helm chart * add configureable resources and probes to the deployment in the helm chart * more helm chart unittests * move some background healthcheck loggin to debug --------- Co-authored-by: Sean Glover <sglover@athenahealth.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
309 lines
10 KiB
YAML
309 lines
10 KiB
YAML
suite: test deployment
|
|
templates:
|
|
- deployment.yaml
|
|
- configmap-litellm.yaml
|
|
tests:
|
|
- it: should work
|
|
template: deployment.yaml
|
|
set:
|
|
image.tag: test
|
|
asserts:
|
|
- isKind:
|
|
of: Deployment
|
|
- matchRegex:
|
|
path: metadata.name
|
|
pattern: -litellm$
|
|
- equal:
|
|
path: spec.template.spec.containers[0].image
|
|
value: ghcr.io/berriai/litellm-database:test
|
|
- it: should work with tolerations
|
|
template: deployment.yaml
|
|
set:
|
|
tolerations:
|
|
- key: node-role.kubernetes.io/master
|
|
operator: Exists
|
|
effect: NoSchedule
|
|
asserts:
|
|
- equal:
|
|
path: spec.template.spec.tolerations[0].key
|
|
value: node-role.kubernetes.io/master
|
|
- equal:
|
|
path: spec.template.spec.tolerations[0].operator
|
|
value: Exists
|
|
- it: should work with affinity
|
|
template: deployment.yaml
|
|
set:
|
|
affinity:
|
|
nodeAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
nodeSelectorTerms:
|
|
- matchExpressions:
|
|
- key: topology.kubernetes.io/zone
|
|
operator: In
|
|
values:
|
|
- antarctica-east1
|
|
asserts:
|
|
- equal:
|
|
path: spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key
|
|
value: topology.kubernetes.io/zone
|
|
- equal:
|
|
path: spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator
|
|
value: In
|
|
- equal:
|
|
path: spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0]
|
|
value: antarctica-east1
|
|
- it: should work without masterkeySecretName or masterkeySecretKey
|
|
template: deployment.yaml
|
|
set:
|
|
masterkeySecretName: ""
|
|
masterkeySecretKey: ""
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: PROXY_MASTER_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: RELEASE-NAME-litellm-masterkey
|
|
key: masterkey
|
|
- it: should work with masterkeySecretName and masterkeySecretKey
|
|
template: deployment.yaml
|
|
set:
|
|
masterkeySecretName: my-secret
|
|
masterkeySecretKey: my-key
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: PROXY_MASTER_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: my-secret
|
|
key: my-key
|
|
- it: should work with extraEnvVars
|
|
template: deployment.yaml
|
|
set:
|
|
extraEnvVars:
|
|
- name: EXTRA_ENV_VAR
|
|
valueFrom:
|
|
fieldRef:
|
|
fieldPath: metadata.labels['env']
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: EXTRA_ENV_VAR
|
|
valueFrom:
|
|
fieldRef:
|
|
fieldPath: metadata.labels['env']
|
|
- it: should work with both extraEnvVars and envVars
|
|
template: deployment.yaml
|
|
set:
|
|
envVars:
|
|
ENV_VAR: ENV_VAR_VALUE
|
|
extraEnvVars:
|
|
- name: EXTRA_ENV_VAR
|
|
value: EXTRA_ENV_VAR_VALUE
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: ENV_VAR
|
|
value: ENV_VAR_VALUE
|
|
- contains:
|
|
path: spec.template.spec.containers[0].env
|
|
content:
|
|
name: EXTRA_ENV_VAR
|
|
value: EXTRA_ENV_VAR_VALUE
|
|
- it: should mount existing configmap when create=false
|
|
template: deployment.yaml
|
|
set:
|
|
proxyConfigMap:
|
|
create: false
|
|
name: my-litellm-config
|
|
key: custom.yaml
|
|
asserts:
|
|
- contains:
|
|
path: spec.template.spec.volumes
|
|
content:
|
|
name: litellm-config
|
|
configMap:
|
|
name: my-litellm-config
|
|
items:
|
|
- key: custom.yaml
|
|
path: config.yaml
|
|
- contains:
|
|
path: spec.template.spec.containers[0].volumeMounts
|
|
content:
|
|
name: litellm-config
|
|
mountPath: /etc/litellm/config.yaml
|
|
subPath: config.yaml
|
|
- it: should work with lifecycle hooks
|
|
template: deployment.yaml
|
|
set:
|
|
lifecycle:
|
|
preStop:
|
|
exec:
|
|
command:
|
|
- /bin/sh
|
|
- -c
|
|
- echo "Container stopping"
|
|
asserts:
|
|
- exists:
|
|
path: spec.template.spec.containers[0].lifecycle
|
|
- equal:
|
|
path: spec.template.spec.containers[0].lifecycle.preStop.exec.command[0]
|
|
value: /bin/sh
|
|
- equal:
|
|
path: spec.template.spec.containers[0].lifecycle.preStop.exec.command[1]
|
|
value: -c
|
|
- equal:
|
|
path: spec.template.spec.containers[0].lifecycle.preStop.exec.command[2]
|
|
value: echo "Container stopping"
|
|
- it: should render background health check settings from proxy_config.general_settings
|
|
template: configmap-litellm.yaml
|
|
set:
|
|
proxy_config.general_settings.background_health_checks: true
|
|
proxy_config.general_settings.health_check_interval: 240
|
|
proxy_config.general_settings.health_check_concurrency: 16
|
|
proxy_config.general_settings.health_check_details: false
|
|
asserts:
|
|
- matchRegex:
|
|
path: data["config.yaml"]
|
|
pattern: '(?m)^\s*background_health_checks:\s*true$'
|
|
- matchRegex:
|
|
path: data["config.yaml"]
|
|
pattern: '(?m)^\s*health_check_interval:\s*240$'
|
|
- matchRegex:
|
|
path: data["config.yaml"]
|
|
pattern: '(?m)^\s*health_check_concurrency:\s*16$'
|
|
- matchRegex:
|
|
path: data["config.yaml"]
|
|
pattern: '(?m)^\s*health_check_details:\s*false$'
|
|
- it: should allow overriding liveness, readiness, and startup probes
|
|
template: deployment.yaml
|
|
set:
|
|
livenessProbe:
|
|
path: /custom/livez
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 15
|
|
timeoutSeconds: 5
|
|
successThreshold: 1
|
|
failureThreshold: 5
|
|
readinessProbe:
|
|
path: /custom/readyz
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 20
|
|
timeoutSeconds: 6
|
|
successThreshold: 1
|
|
failureThreshold: 6
|
|
startupProbe:
|
|
path: /custom/startupz
|
|
initialDelaySeconds: 15
|
|
periodSeconds: 25
|
|
timeoutSeconds: 7
|
|
successThreshold: 1
|
|
failureThreshold: 40
|
|
asserts:
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.httpGet.path
|
|
value: /custom/livez
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.timeoutSeconds
|
|
value: 5
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.httpGet.path
|
|
value: /custom/readyz
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds
|
|
value: 6
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.httpGet.path
|
|
value: /custom/startupz
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.failureThreshold
|
|
value: 40
|
|
- it: should render container resources from values
|
|
template: deployment.yaml
|
|
set:
|
|
resources:
|
|
limits:
|
|
cpu: 500m
|
|
memory: 2Gi
|
|
requests:
|
|
cpu: 250m
|
|
memory: 1Gi
|
|
asserts:
|
|
- equal:
|
|
path: spec.template.spec.containers[0].resources.limits.cpu
|
|
value: 500m
|
|
- equal:
|
|
path: spec.template.spec.containers[0].resources.limits.memory
|
|
value: 2Gi
|
|
- equal:
|
|
path: spec.template.spec.containers[0].resources.requests.cpu
|
|
value: 250m
|
|
- equal:
|
|
path: spec.template.spec.containers[0].resources.requests.memory
|
|
value: 1Gi
|
|
- it: should keep default probes and empty resources unchanged
|
|
template: deployment.yaml
|
|
asserts:
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.httpGet.path
|
|
value: /health/liveliness
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.initialDelaySeconds
|
|
value: 0
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.periodSeconds
|
|
value: 10
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.timeoutSeconds
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.successThreshold
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].livenessProbe.failureThreshold
|
|
value: 3
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.httpGet.path
|
|
value: /health/readiness
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.initialDelaySeconds
|
|
value: 0
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.periodSeconds
|
|
value: 10
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.successThreshold
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].readinessProbe.failureThreshold
|
|
value: 3
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.httpGet.path
|
|
value: /health/readiness
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.initialDelaySeconds
|
|
value: 0
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.periodSeconds
|
|
value: 10
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.timeoutSeconds
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.successThreshold
|
|
value: 1
|
|
- equal:
|
|
path: spec.template.spec.containers[0].startupProbe.failureThreshold
|
|
value: 30
|
|
- equal:
|
|
path: spec.template.spec.containers[0].resources
|
|
value: {}
|