Skip to content

Commit 0f8b424

Browse files
Merge pull request #107 from umago/persistent-database
Add PVC for persistent PostgreSQL storage
2 parents 0a68dfd + 5b8e848 commit 0f8b424

23 files changed

Lines changed: 285 additions & 19 deletions

api/v1beta1/openstacklightspeed_types.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v1beta1
1919
import (
2020
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
2121
"github.com/openstack-k8s-operators/lib-common/modules/common/util"
22+
"k8s.io/apimachinery/pkg/api/resource"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2324
)
2425

@@ -48,6 +49,18 @@ const (
4849
MaxTokensForResponseDefault = 2048
4950
)
5051

52+
// DatabaseSpec defines configuration for persistent PostgreSQL storage.
53+
type DatabaseSpec struct {
54+
// +kubebuilder:validation:Optional
55+
// Size of the PersistentVolumeClaim for PostgreSQL data. Defaults to 1Gi.
56+
Size resource.Quantity `json:"size,omitempty"`
57+
58+
// +kubebuilder:validation:Optional
59+
// StorageClass name for the PersistentVolumeClaim. If omitted, the cluster's
60+
// default StorageClass is used.
61+
Class string `json:"class,omitempty"`
62+
}
63+
5164
// OpenStackLightspeedSpec defines the desired state of OpenStackLightspeed
5265
type OpenStackLightspeedSpec struct {
5366
OpenStackLightspeedCore `json:",inline"`
@@ -65,6 +78,12 @@ type OpenStackLightspeedSpec struct {
6578
// Allows forcing a specific OCP version instead of auto-detection.
6679
// Format should be like "4.15", "4.16", etc.
6780
OCPRAGVersionOverride string `json:"ocpVersionOverride,omitempty"`
81+
82+
// +kubebuilder:validation:Optional
83+
// Database configures persistent storage for PostgreSQL data.
84+
// When omitted, an emptyDir volume is used (data is lost on pod reschedule).
85+
// When set, a PersistentVolumeClaim is created and mounted.
86+
Database *DatabaseSpec `json:"database,omitempty"`
6887
}
6988

7089
// OpenStackLightspeedCore defines the desired state of OpenStackLightspeed
@@ -154,6 +173,7 @@ type OpenStackLightspeedStatus struct {
154173
// +operator-sdk:csv:customresourcedefinitions:resources={{ServiceAccount,v1,lightspeed-app-server}}
155174
// +operator-sdk:csv:customresourcedefinitions:resources={{NetworkPolicy,v1,lightspeed-app-server}}
156175
// +operator-sdk:csv:customresourcedefinitions:resources={{NetworkPolicy,v1,lightspeed-postgres-server}}
176+
// +operator-sdk:csv:customresourcedefinitions:resources={{PersistentVolumeClaim,v1,openstack-lightspeed-data}}
157177
// +operator-sdk:csv:customresourcedefinitions:resources={{ClusterRole,v1,lightspeed-app-server-sar-role}}
158178
// +operator-sdk:csv:customresourcedefinitions:resources={{ClusterRoleBinding,v1,lightspeed-app-server-sar-role-binding}}
159179
// +operator-sdk:csv:customresourcedefinitions:resources={{Subscription,v1alpha1}}

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 22 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bundle/manifests/lightspeed.openstack.org_openstacklightspeeds.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ spec:
4949
spec:
5050
description: OpenStackLightspeedSpec defines the desired state of OpenStackLightspeed
5151
properties:
52+
database:
53+
description: |-
54+
Database configures persistent storage for PostgreSQL data.
55+
When omitted, an emptyDir volume is used (data is lost on pod reschedule).
56+
When set, a PersistentVolumeClaim is created and mounted.
57+
properties:
58+
class:
59+
description: |-
60+
StorageClass name for the PersistentVolumeClaim. If omitted, the cluster's
61+
default StorageClass is used.
62+
type: string
63+
size:
64+
anyOf:
65+
- type: integer
66+
- type: string
67+
description: Size of the PersistentVolumeClaim for PostgreSQL
68+
data. Defaults to 1Gi.
69+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
70+
x-kubernetes-int-or-string: true
71+
type: object
5272
enableOCPRAG:
5373
default: false
5474
description: Enables automatic OCP documentation based on cluster

bundle/manifests/openstack-lightspeed-operator.clusterserviceversion.yaml

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ metadata:
2525
]
2626
capabilities: Basic Install
2727
categories: AI/Machine Learning
28-
createdAt: "2026-05-17T15:20:36Z"
28+
createdAt: "2026-05-27T08:37:10Z"
2929
description: AI-powered virtual assistant for Red Hat OpenStack Services on OpenShift
3030
features.operators.openshift.io/cnf: "false"
3131
features.operators.openshift.io/cni: "false"
@@ -113,6 +113,9 @@ spec:
113113
- kind: Secret
114114
name: metrics-reader-token
115115
version: v1
116+
- kind: PersistentVolumeClaim
117+
name: openstack-lightspeed-data
118+
version: v1
116119
specDescriptors:
117120
- description: |-
118121
Secret name containing API token for the LLMEndpoint. The secret must contain
@@ -361,11 +364,10 @@ spec:
361364
- apiGroups:
362365
- ""
363366
resources:
364-
- secrets
367+
- persistentvolumeclaims
368+
- services
365369
verbs:
366370
- create
367-
- delete
368-
- deletecollection
369371
- get
370372
- list
371373
- patch
@@ -374,23 +376,25 @@ spec:
374376
- apiGroups:
375377
- ""
376378
resources:
377-
- serviceaccounts
379+
- secrets
378380
verbs:
379381
- create
382+
- delete
383+
- deletecollection
380384
- get
381385
- list
382386
- patch
387+
- update
383388
- watch
384389
- apiGroups:
385390
- ""
386391
resources:
387-
- services
392+
- serviceaccounts
388393
verbs:
389394
- create
390395
- get
391396
- list
392397
- patch
393-
- update
394398
- watch
395399
- apiGroups:
396400
- apps

config/crd/bases/lightspeed.openstack.org_openstacklightspeeds.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ spec:
4949
spec:
5050
description: OpenStackLightspeedSpec defines the desired state of OpenStackLightspeed
5151
properties:
52+
database:
53+
description: |-
54+
Database configures persistent storage for PostgreSQL data.
55+
When omitted, an emptyDir volume is used (data is lost on pod reschedule).
56+
When set, a PersistentVolumeClaim is created and mounted.
57+
properties:
58+
class:
59+
description: |-
60+
StorageClass name for the PersistentVolumeClaim. If omitted, the cluster's
61+
default StorageClass is used.
62+
type: string
63+
size:
64+
anyOf:
65+
- type: integer
66+
- type: string
67+
description: Size of the PersistentVolumeClaim for PostgreSQL
68+
data. Defaults to 1Gi.
69+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
70+
x-kubernetes-int-or-string: true
71+
type: object
5272
enableOCPRAG:
5373
default: false
5474
description: Enables automatic OCP documentation based on cluster

config/manifests/bases/openstack-lightspeed-operator.clusterserviceversion.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ spec:
9090
- kind: Secret
9191
name: metrics-reader-token
9292
version: v1
93+
- kind: PersistentVolumeClaim
94+
name: openstack-lightspeed-data
95+
version: v1
9396
specDescriptors:
9497
- description: |-
9598
Secret name containing API token for the LLMEndpoint. The secret must contain

config/rbac/role.yaml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,10 @@ rules:
111111
- apiGroups:
112112
- ""
113113
resources:
114-
- secrets
114+
- persistentvolumeclaims
115+
- services
115116
verbs:
116117
- create
117-
- delete
118-
- deletecollection
119118
- get
120119
- list
121120
- patch
@@ -124,23 +123,25 @@ rules:
124123
- apiGroups:
125124
- ""
126125
resources:
127-
- serviceaccounts
126+
- secrets
128127
verbs:
129128
- create
129+
- delete
130+
- deletecollection
130131
- get
131132
- list
132133
- patch
134+
- update
133135
- watch
134136
- apiGroups:
135137
- ""
136138
resources:
137-
- services
139+
- serviceaccounts
138140
verbs:
139141
- create
140142
- get
141143
- list
142144
- patch
143-
- update
144145
- watch
145146
- apiGroups:
146147
- apps

config/samples/api_v1beta1_openstacklightspeed.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ spec:
1111
llmCredentials: openstack-lightspeed-apitoken
1212
modelName: llama3.1:8b
1313
tlsCACertBundle: openstack-lightspeed-certs
14+
# Uncomment to customize persistent PostgreSQL storage:
15+
# database:
16+
# size: "5Gi"
17+
# class: "my-storage-class"

internal/controller/constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ const (
7272
PostgresConfigVolumeMountPath = "/usr/share/pgsql/postgresql.conf.sample"
7373
PostgresDataVolume = "postgres-data"
7474
PostgresDataVolumeMountPath = "/var/lib/pgsql"
75+
PostgresDataPVCName = "openstack-lightspeed-data"
76+
PostgresDataPVCDefaultSize = "1Gi"
7577
PostgresVarRunVolumeName = "lightspeed-postgres-var-run"
7678
PostgresVarRunVolumeMountPath = "/var/run/postgresql"
7779
TmpVolumeName = "tmp-writable-volume"

internal/controller/errors.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,7 @@ var (
5959
ErrCreatePostgresConfigMap = errors.New("failed to create Postgres configmap")
6060
ErrGetPostgresConfigMap = errors.New("failed to get Postgres configmap")
6161
ErrCreatePostgresNetworkPolicy = errors.New("failed to create Postgres network policy")
62+
ErrCreatePostgresPVC = errors.New("failed to create Postgres PVC")
63+
ErrGetPostgresPVC = errors.New("failed to get Postgres PVC")
64+
ErrPostgresPVCSizeMismatch = errors.New("existing Postgres PVC size does not match requested size")
6265
)

0 commit comments

Comments
 (0)