From b4e56c6a41bca61cdec2e6681e57b383bafa0ea7 Mon Sep 17 00:00:00 2001 From: mgdevstack <8110509+mgdevstack@users.noreply.github.com> Date: Wed, 13 May 2026 13:43:34 +0530 Subject: [PATCH 1/2] Add aiio services --- .../templates/roost-ai-code-analyzer.yaml | 179 ++++++++++++++++++ charts/roost/templates/roost-nginx.yaml | 27 ++- charts/roost/values.yaml | 20 +- 3 files changed, 224 insertions(+), 2 deletions(-) create mode 100644 charts/roost/templates/roost-ai-code-analyzer.yaml diff --git a/charts/roost/templates/roost-ai-code-analyzer.yaml b/charts/roost/templates/roost-ai-code-analyzer.yaml new file mode 100644 index 0000000..69cba9a --- /dev/null +++ b/charts/roost/templates/roost-ai-code-analyzer.yaml @@ -0,0 +1,179 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: roost-ai-code-analyzer-config + namespace: {{ .Release.Namespace }} +data: + DATABASE_URL: 'postgresql://{{ .Values.aiCodeAnalyzer.db.user }}:{{ .Values.aiCodeAnalyzer.db.password }}@ai-code-analyzer-db-svc.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:5432/{{ .Values.aiCodeAnalyzer.db.database }}' + POSTGRES_DB: '{{ .Values.aiCodeAnalyzer.db.database }}' + POSTGRES_USER: '{{ .Values.aiCodeAnalyzer.db.user }}' + POSTGRES_PASSWORD: '{{ .Values.aiCodeAnalyzer.db.password }}' + +--- +apiVersion: v1 +kind: Service +metadata: + name: ai-code-analyzer-svc + namespace: {{ .Release.Namespace }} +spec: + selector: + app: ai-code-analyzer + ports: + - protocol: TCP + port: 5060 + targetPort: 5060 + +--- +apiVersion: v1 +kind: Service +metadata: + name: ai-code-analyzer-db-svc + namespace: {{ .Release.Namespace }} +spec: + selector: + app: ai-code-analyzer-db + ports: + - protocol: TCP + port: 5432 + targetPort: 5432 + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ai-code-analyzer-pvc-{{ .Release.Namespace }} + namespace: {{ .Release.Namespace }} +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: {{ .Values.aiCodeAnalyzer.storage.size }} +{{- include "cluster.storageClassName" . | indent 2 }} + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ai-code-analyzer-db-pvc-{{ .Release.Namespace }} + namespace: {{ .Release.Namespace }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.aiCodeAnalyzer.db.storage.size }} +{{- include "cluster.storageClassName" . | indent 2 }} + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-code-analyzer-db + namespace: {{ .Release.Namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: ai-code-analyzer-db + template: + metadata: + labels: + app: ai-code-analyzer-db + spec: + containers: + - name: ai-code-analyzer-db + image: postgres:18-alpine + envFrom: + - configMapRef: + name: roost-ai-code-analyzer-config + env: + - name: PGDATA + value: /var/lib/postgresql/data + ports: + - containerPort: 5432 + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: ai-code-analyzer-db-storage + livenessProbe: + exec: + command: + - pg_isready + - -U + - {{ .Values.aiCodeAnalyzer.db.user }} + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + exec: + command: + - pg_isready + - -U + - {{ .Values.aiCodeAnalyzer.db.user }} + initialDelaySeconds: 10 + periodSeconds: 5 + imagePullPolicy: Always + volumes: + - name: ai-code-analyzer-db-storage + persistentVolumeClaim: + claimName: ai-code-analyzer-db-pvc-{{ .Release.Namespace }} + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ai-code-analyzer + namespace: {{ .Release.Namespace }} +spec: + replicas: {{ .Values.aiCodeAnalyzer.replicas }} + selector: + matchLabels: + app: ai-code-analyzer + template: + metadata: + labels: + app: ai-code-analyzer + annotations: + checksum/config: {{ toYaml (pick .Values "aiCodeAnalyzer") | sha256sum }} + spec: + securityContext: + runAsNonRoot: true + runAsUser: 10001 + runAsGroup: 10001 + fsGroup: 10001 + initContainers: + - name: wait-for-db + image: postgres:18-alpine + command: + - sh + - -c + - | + until pg_isready -h ai-code-analyzer-db-svc -p 5432 -U {{ .Values.aiCodeAnalyzer.db.user }}; + do + echo "Waiting for postgres..." + sleep 2 + done + containers: + - name: ai-code-analyzer + image: zbio/ai-io:{{ .Values.aiCodeAnalyzer.imageTag }} + envFrom: + - configMapRef: + name: roost-ai-code-analyzer-config + ports: + - containerPort: 5060 + volumeMounts: + - mountPath: /app/chroma_db + subPath: chroma_db + name: ai-code-analyzer-storage + - mountPath: /app/jobs + subPath: jobs + name: ai-code-analyzer-storage + - mountPath: /app/test_artifacts + subPath: test_artifacts + name: ai-code-analyzer-storage + imagePullPolicy: Always + volumes: + - name: ai-code-analyzer-storage + persistentVolumeClaim: + claimName: ai-code-analyzer-pvc-{{ .Release.Namespace }} + +--- \ No newline at end of file diff --git a/charts/roost/templates/roost-nginx.yaml b/charts/roost/templates/roost-nginx.yaml index 0918b6e..a42ed77 100644 --- a/charts/roost/templates/roost-nginx.yaml +++ b/charts/roost/templates/roost-nginx.yaml @@ -11,6 +11,11 @@ data: UI_SERVICE_NAME: roostai-react-app:4200 UI_SERVICE_PORT: '4200' K8S_MODE: 'true' + AI_CODE_ANALYZER_SERVICE_NAME: ai-code-analyzer-svc:5060 + AI_CODE_ANALYZER_SERVICE_PORT: '5060' + AI_CODE_ANALYZER_SUBDOMAIN: 'f{{ .Values.enterprise.domainURL }}' + AI_ANALYZER_DOMAIN: 'f{{ .Values.enterprise.domainURL }}' + MAIN_DOMAIN: '{{ .Values.enterprise.domainURL }}' --- apiVersion: v1 @@ -117,11 +122,31 @@ spec: namespace: {{ .Release.Namespace }} hostnames: - {{ .Values.enterprise.domainURL | quote }} + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: roost-nginx-svc + port: 80 + +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: roost-ai-code-analyzer-route + namespace: {{ .Release.Namespace }} +spec: + parentRefs: + - name: roost-gateway + namespace: {{ .Release.Namespace }} + hostnames: + - {{ printf "f%s" .Values.enterprise.domainURL | quote }} rules: - backendRefs: - name: roost-nginx-svc port: 80 - --- {{- else }} diff --git a/charts/roost/values.yaml b/charts/roost/values.yaml index 64c18b4..dce581b 100644 --- a/charts/roost/values.yaml +++ b/charts/roost/values.yaml @@ -233,4 +233,22 @@ pvcs: eaasServerIp: '' eaasServerPemKey : '' -eaasServerUsername : 'roost' \ No newline at end of file +eaasServerUsername : 'roost' + +aiCodeAnalyzer: + enabled: true + + replicas: 1 + + imageTag: latest + + storage: + size: 20Gi + + db: + database: code_parser + user: postgres + password: '12345678' + + storage: + size: 20Gi \ No newline at end of file From 3061170a280f1f5925587160f4374c8ad77fbc31 Mon Sep 17 00:00:00 2001 From: mgdevstack <8110509+mgdevstack@users.noreply.github.com> Date: Wed, 13 May 2026 13:51:11 +0530 Subject: [PATCH 2/2] Add aiio services and update release --- releases/index.yaml | 6 +++--- releases/roost-1.0.0.tgz | Bin 15683 -> 16555 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/releases/index.yaml b/releases/index.yaml index a7c610b..d1f8a9c 100644 --- a/releases/index.yaml +++ b/releases/index.yaml @@ -3,12 +3,12 @@ entries: roost: - apiVersion: v2 appVersion: 1.0.0 - created: "2026-03-25T16:17:21.816689+05:30" + created: "2026-05-13T13:43:46.603176+05:30" description: Roost.ai, an End-to-End Testing platform using Generative AI. - digest: a56481164a691168c138d096020ac43f98350a84695c463d06e1d211552eaec6 + digest: d1626eade9a17698c2cda4e142597315366ae6a568440d8e2a61a855bb7b7f95 name: roost type: application urls: - https://roost-io.github.io/helm/releases/roost-1.0.0.tgz version: 1.0.0 -generated: "2026-03-25T16:17:21.815145+05:30" +generated: "2026-05-13T13:43:46.601318+05:30" diff --git a/releases/roost-1.0.0.tgz b/releases/roost-1.0.0.tgz index e06700542da5235c40b2890670642e89327a52f9..2e3c35e50d33503fee991c5c8eac403938423e07 100644 GIT binary patch literal 16555 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 S@PBz}&<@``7T6DPu>S?L$*LUy