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
4 changes: 4 additions & 0 deletions helm/templates/agent-deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ spec:
{{- else }}
replicas: 1
{{- end }}
{{- if .Values.server.persistentVolume.enabled }}
strategy:
type: Recreate
{{- end }}
template:
metadata:
{{- include "cloudzero-agent.generateAnnotations" .Values.server.podAnnotations | nindent 8 }}
Expand Down
196 changes: 196 additions & 0 deletions helm/tests/persistent_volume_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
suite: test persistent volume configuration
templates:
- templates/agent-deploy.yaml
- templates/agent-pvc.yaml
tests:
# Test persistent volume disabled (default behavior)
- it: should use emptyDir when persistentVolume is disabled
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: false
asserts:
# Verify emptyDir is used for storage
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
emptyDir:
sizeLimit: 8Gi
# Verify strategy is not set (should use default RollingUpdate)
- isNull:
path: spec.strategy

# Test persistent volume enabled - basic configuration
- it: should use PVC when persistentVolume is enabled
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: true
server.persistentVolume.size: 10Gi
asserts:
# Verify PVC is used for storage
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
persistentVolumeClaim:
claimName: RELEASE-NAME-cz-server
# Verify strategy is set to Recreate
- equal:
path: spec.strategy.type
value: Recreate
# Verify volume mount is configured
- contains:
path: spec.template.spec.containers[1].volumeMounts
content:
name: cloudzero-agent-storage-volume
mountPath: /data
subPath: ""

# Test PVC is created when enabled
- it: should create PVC when persistentVolume is enabled
template: templates/agent-pvc.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: true
server.persistentVolume.size: 15Gi
server.persistentVolume.storageClass: "fast-ssd"
asserts:
- isKind:
of: PersistentVolumeClaim
- equal:
path: metadata.name
value: RELEASE-NAME-cz-server
- equal:
path: spec.resources.requests.storage
value: 15Gi
- equal:
path: spec.storageClassName
value: fast-ssd

# Test PVC is not created when disabled
- it: should not create PVC when persistentVolume is disabled
template: templates/agent-pvc.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: false
asserts:
- hasDocuments:
count: 0

# Test existing PVC claim name is used
- it: should use existingClaim when specified
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: true
server.persistentVolume.existingClaim: "my-existing-pvc"
asserts:
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
persistentVolumeClaim:
claimName: my-existing-pvc
# Should still use Recreate strategy with existing claim
- equal:
path: spec.strategy.type
value: Recreate

# Test custom mount path
- it: should use custom mountPath when specified
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
server.persistentVolume.enabled: true
server.persistentVolume.mountPath: /custom/data/path
server.persistentVolume.subPath: "prometheus-data"
asserts:
- contains:
path: spec.template.spec.containers[1].volumeMounts
content:
name: cloudzero-agent-storage-volume
mountPath: /custom/data/path
subPath: "prometheus-data"

# Test persistent volume with agent mode (Prometheus)
- it: should work with agent mode (Prometheus with --enable-feature=agent)
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
components.agent.mode: agent
server.persistentVolume.enabled: true
asserts:
# Verify Prometheus container is used
- equal:
path: spec.template.spec.containers[1].name
value: cloudzero-agent-server
# Verify strategy is Recreate
- equal:
path: spec.strategy.type
value: Recreate
# Verify PVC is mounted
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
persistentVolumeClaim:
claimName: RELEASE-NAME-cz-server

# Test persistent volume with server mode (standard Prometheus)
- it: should work with server mode (standard Prometheus)
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
components.agent.mode: server
server.persistentVolume.enabled: true
asserts:
# Verify Prometheus container is used
- equal:
path: spec.template.spec.containers[1].name
value: cloudzero-agent-server
# Verify strategy is Recreate
- equal:
path: spec.strategy.type
value: Recreate
# Verify PVC is mounted
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
persistentVolumeClaim:
claimName: RELEASE-NAME-cz-server

# Test persistent volume with federated mode
- it: should work with federated mode
template: templates/agent-deploy.yaml
set:
apiKey: "test-key"
existingSecretName: null
components.agent.mode: federated
server.persistentVolume.enabled: true
asserts:
# Verify Prometheus container is used
- equal:
path: spec.template.spec.containers[1].name
value: cloudzero-agent-server
# Verify strategy is Recreate
- equal:
path: spec.strategy.type
value: Recreate
# Verify PVC is mounted
- contains:
path: spec.template.spec.volumes
content:
name: cloudzero-agent-storage-volume
persistentVolumeClaim:
claimName: RELEASE-NAME-cz-server
4 changes: 2 additions & 2 deletions helm/tests/server_deployment_name_independence_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ tests:
set:
apiKey: "test-key"
existingSecretName: null
components.agent.mode: clustered
components.agent.mode: agent
server.persistentVolume.enabled: true
server.persistentVolume.size: 10Gi
server.persistentVolume.accessModes:
Expand All @@ -117,7 +117,7 @@ tests:
set:
apiKey: "test-key"
existingSecretName: null
components.agent.mode: clustered
components.agent.mode: agent
server.persistentVolume.enabled: true
server.persistentVolume.size: 10Gi
server.persistentVolume.accessModes:
Expand Down
36 changes: 36 additions & 0 deletions helm/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -5410,6 +5410,42 @@
}
}
}
},
{
"if": {
"properties": {
"components": {
"properties": {
"agent": {
"properties": {
"mode": {
"const": "clustered"
}
},
"type": "object"
}
},
"type": "object"
}
}
},
"then": {
"properties": {
"server": {
"properties": {
"persistentVolume": {
"properties": {
"enabled": {
"const": false
}
},
"type": "object"
}
},
"type": "object"
}
}
}
}
],
"anyOf": [
Expand Down
35 changes: 35 additions & 0 deletions helm/values.schema.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2364,3 +2364,38 @@ allOf:
oneOf:
- type: "null"
- const: federated

# Conditional: Persistent volume constraint for clustered mode
#
# If components.agent.mode is "clustered" (Alloy mode), then
# server.persistentVolume.enabled must be false.
#
# This is necessary because:
# 1. Alloy doesn't use the persistent volume mount (it uses /tmp/alloy)
# 2. Alloy is designed for horizontal scaling with multiple replicas
# 3. Persistent volumes with ReadWriteOnce can't be shared across pods
# 4. The Recreate deployment strategy (required for PV) prevents proper
# rolling updates needed for multi-replica deployments
#
# In clustered/Alloy mode, metrics data should be transient and stored
# in remote storage via remote_write configuration.
- if:
properties:
components:
type: object
properties:
agent:
type: object
properties:
mode:
const: clustered
then:
properties:
server:
type: object
properties:
persistentVolume:
type: object
properties:
enabled:
const: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Valid: Agent mode (Prometheus) with persistent volume enabled
# Persistent volumes work fine with non-clustered modes (agent, server, federated)
apiKey: "test-key"
existingSecretName: null
components:
agent:
mode: agent
server:
persistentVolume:
enabled: true
size: 10Gi
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Valid: Clustered mode (Alloy) with persistent volume explicitly disabled
# Persistent volumes are not supported in clustered mode
apiKey: "test-key"
existingSecretName: null
components:
agent:
mode: clustered
server:
persistentVolume:
enabled: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Invalid: Clustered mode (Alloy) with persistent volume enabled
# This should fail because persistent volumes are incompatible with clustered mode:
# - Alloy uses /tmp/alloy for ephemeral storage, not the PV mount
# - Clustered mode supports multiple replicas, but PVs with ReadWriteOnce can't be shared
# - The Recreate deployment strategy (required for PV) prevents rolling updates
apiKey: "test-key"
existingSecretName: null
components:
agent:
mode: clustered
server:
persistentVolume:
enabled: true
Loading