@@ -4,8 +4,8 @@ on: [push, pull_request]
44
55jobs :
66 build :
7-
87 runs-on : ubuntu-latest
8+
99 strategy :
1010 matrix :
1111 python-version : ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy3.10']
@@ -18,83 +18,284 @@ jobs:
1818 CLIENT_SECRET : P9f8350QQIUhFfK1GF5sMhq4Dm3P6Sbs
1919
2020 steps :
21- - name : Check out repository
21+ - name : Checkout repository
2222 uses : actions/checkout@v4
23+
2324 - name : Set up Python ${{ matrix.python-version }}
2425 uses : actions/setup-python@v5
2526 with :
2627 python-version : ${{ matrix.python-version }}
27- - name : Set up a Keycloak docker container
28- timeout-minutes : 5
28+
29+ - name : Set up Kubernetes (KinD)
30+ 31+ with :
32+ cluster_name : vertica-ci
33+ node_image : kindest/node:v1.29.0
34+
35+ - name : Set up Helm
36+ uses : azure/setup-helm@v3
37+ with :
38+ version : " 3.11.3"
39+
40+ - name : Add Helm repos
41+ run : |
42+ helm repo add vertica-charts https://vertica.github.io/charts || true
43+ helm repo add bitnami https://charts.bitnami.com/bitnami || true
44+ helm repo update
45+
46+ # Step 4: Install MinIO for communal storage
47+ - name : Install MinIO (namespace minio)
2948 run : |
30- docker network create -d bridge my-network
31- docker run -d -p 8080:8080 \
32- --name keycloak --network my-network \
33- -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin \
34- quay.io/keycloak/keycloak:23.0.4 start-dev
35- docker container ls
36-
37- - name : Set up a Vertica server docker container
38- timeout-minutes : 15
49+ kubectl create ns minio || true
50+ cat <<'EOF' > minio.yaml
51+ apiVersion: apps/v1
52+ kind: Deployment
53+ metadata:
54+ name: minio
55+ namespace: minio
56+ spec:
57+ replicas: 1
58+ selector:
59+ matchLabels:
60+ app: minio
61+ template:
62+ metadata:
63+ labels:
64+ app: minio
65+ spec:
66+ containers:
67+ - name: minio
68+ image: minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1
69+ args: ["server", "/data"]
70+ env:
71+ - name: MINIO_ROOT_USER
72+ value: "minioadmin"
73+ - name: MINIO_ROOT_PASSWORD
74+ value: "minioadmin"
75+ ports:
76+ - containerPort: 9000
77+ volumeMounts:
78+ - name: data
79+ mountPath: /data
80+ volumes:
81+ - name: data
82+ emptyDir: {}
83+ ---
84+ apiVersion: v1
85+ kind: Service
86+ metadata:
87+ name: minio
88+ namespace: minio
89+ spec:
90+ selector:
91+ app: minio
92+ ports:
93+ - port: 9000
94+ targetPort: 9000
95+ EOF
96+ kubectl apply -f minio.yaml
97+ kubectl -n minio rollout status deployment/minio --timeout=2m || true
98+ kubectl get pods -n minio -o wide || true
99+ kubectl get svc -n minio || true
100+
101+ - name : Ensure MinIO bucket exists
39102 run : |
40- docker run -d -p 5433:5433 -p 5444:5444 \
41- --name vertica_docker --network my-network \
42- opentext/vertica-ce:24.4.0-0
43- echo "Vertica startup ..."
44- until docker exec vertica_docker test -f /data/vertica/VMart/agent_start.out; do \
45- echo "..."; \
46- sleep 3; \
47- done;
48- echo "Vertica is up"
49- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "\l"
50- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "select version()"
51-
52- - name : Configure Keycloak
103+ kubectl run mc-client --rm -i --restart=Never \
104+ --image=minio/mc:latest \
105+ -n minio \
106+ --command -- bash -c "
107+ mc alias set localminio http://minio.minio.svc.cluster.local:9000 minioadmin minioadmin && \
108+ mc mb --ignore-existing localminio/vertica-fleeting && \
109+ mc ls localminio
110+ "
111+
112+ # Create MinIO credentials secret
113+ - name : Create MinIO Secret
53114 run : |
54- echo "Wait for keycloak ready ..."
55- bash -c 'while true; do curl -s localhost:8080 &>/dev/null; ret=$?; [[ $ret -eq 0 ]] && break; echo "..."; sleep 3; done'
56-
57- docker exec -i keycloak /bin/bash <<EOF
58- /opt/keycloak/bin/kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin --password admin
59- /opt/keycloak/bin/kcadm.sh create realms -s realm=${REALM} -s enabled=true
60- /opt/keycloak/bin/kcadm.sh update realms/${REALM} -s accessTokenLifespan=3600
61- /opt/keycloak/bin/kcadm.sh get realms/${REALM}
62- /opt/keycloak/bin/kcadm.sh create users -r ${REALM} -s username=${USER} -s enabled=true
63- /opt/keycloak/bin/kcadm.sh set-password -r ${REALM} --username ${USER} --new-password ${PASSWORD}
64- /opt/keycloak/bin/kcadm.sh get users -r ${REALM}
65- /opt/keycloak/bin/kcadm.sh create clients -r ${REALM} -s clientId=${CLIENT_ID} -s enabled=true \
66- -s 'redirectUris=["/*"]' -s 'webOrigins=["/*"]' -s secret=${CLIENT_SECRET} -s directAccessGrantsEnabled=true -o
115+ kubectl delete secret communal-creds -n my-verticadb-operator --ignore-not-found
116+ kubectl create ns my-verticadb-operator || true
117+ kubectl create secret generic communal-creds \
118+ -n my-verticadb-operator \
119+ --from-literal=accesskey="minioadmin" \
120+ --from-literal=secretkey="minioadmin"
121+ kubectl get secret communal-creds -n my-verticadb-operator -o yaml || true
122+
123+ # Install Vertica Operator
124+ - name : Install Vertica Operator
125+ run : |
126+ cat <<'EOF' > operator-values.yaml
127+ installCRDs: true
128+ controller:
129+ extraEnv:
130+ - name: AWS_REGION
131+ value: "us-east-1"
132+ - name: AWS_DEFAULT_REGION
133+ value: "us-east-1"
67134 EOF
135+ helm upgrade --install vdb-op vertica-charts/verticadb-operator \
136+ -n my-verticadb-operator -f operator-values.yaml --wait --timeout 10m
137+ kubectl -n my-verticadb-operator get pods -o wide || true
68138
69- # Retrieving an Access Token
70- curl --location --request POST http://`hostname`:8080/realms/${REALM}/protocol/openid-connect/token \
71- --header 'Content-Type: application/x-www-form-urlencoded' \
72- --data-urlencode "username=${USER}" \
73- --data-urlencode "password=${PASSWORD}" \
74- --data-urlencode "client_id=${CLIENT_ID}" \
75- --data-urlencode "client_secret=${CLIENT_SECRET}" \
76- --data-urlencode 'grant_type=password' -o oauth.json
77- cat oauth.json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["access_token"])' > access_token.txt
78-
79- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "CREATE AUTHENTICATION v_oauth METHOD 'oauth' HOST '0.0.0.0/0';"
80- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "ALTER AUTHENTICATION v_oauth SET client_id = '${CLIENT_ID}';"
81- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "ALTER AUTHENTICATION v_oauth SET client_secret = '${CLIENT_SECRET}';"
82- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "ALTER AUTHENTICATION v_oauth SET discovery_url = 'http://`hostname`:8080/realms/${REALM}/.well-known/openid-configuration';"
83- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "ALTER AUTHENTICATION v_oauth SET introspect_url = 'http://`hostname`:8080/realms/${REALM}/protocol/openid-connect/token/introspect';"
84- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "SELECT * FROM client_auth WHERE auth_name='v_oauth';"
85- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "CREATE USER ${USER};"
86- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "GRANT AUTHENTICATION v_oauth TO ${USER};"
87- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "GRANT ALL ON SCHEMA PUBLIC TO ${USER};"
88- # A dbadmin-specific authentication record (connect remotely) is needed after setting up an OAuth user
89- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "CREATE AUTHENTICATION v_dbadmin_hash METHOD 'hash' HOST '0.0.0.0/0';"
90- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "ALTER AUTHENTICATION v_dbadmin_hash PRIORITY 10000;"
91- docker exec -u dbadmin vertica_docker /opt/vertica/bin/vsql -c "GRANT AUTHENTICATION v_dbadmin_hash TO dbadmin;"
139+ # Deploy VerticaDB with MinIO
140+ - name : Deploy VerticaDB
141+ run : |
142+ cat <<'EOF' | kubectl apply -f -
143+ apiVersion: vertica.com/v1
144+ kind: VerticaDB
145+ metadata:
146+ name: verticadb-sample
147+ namespace: my-verticadb-operator
148+ spec:
149+ image: opentext/vertica-k8s:latest
150+ dbName: vdb
151+ initPolicy: Create
152+ communal:
153+ path: s3://vertica-fleeting/mkottakota/
154+ credentialSecret: communal-creds
155+ endpoint: http://minio.minio.svc.cluster.local:9000
156+ region: us-east-1
157+ local:
158+ dataPath: /data
159+ depotPath: /depot
160+ subclusters:
161+ - name: defaultsubcluster
162+ size: 3
163+ EOF
164+ kubectl annotate verticadb verticadb-sample -n my-verticadb-operator \
165+ vertica.com/ci-reconcile="$(date -u +%s)" --overwrite || true
166+
167+ # Wait for Vertica readiness
168+ - name : Wait for Vertica readiness
169+ run : |
170+ NS=my-verticadb-operator
171+ SS=verticadb-sample-defaultsubcluster
172+ POD=${SS}-0
173+ for i in {1..30}; do
174+ kubectl get pod ${POD} -n ${NS} && break || sleep 10
175+ done
176+ kubectl wait --for=condition=Ready pod/${POD} -n ${NS} --timeout=5m || true
177+
178+ # Deploy Keycloak in K8s
179+ - name : Deploy Keycloak
180+ run : |
181+ kubectl create ns keycloak || true
182+ cat <<'EOF' | kubectl apply -f -
183+ apiVersion: apps/v1
184+ kind: Deployment
185+ metadata:
186+ name: keycloak
187+ namespace: keycloak
188+ spec:
189+ replicas: 1
190+ selector:
191+ matchLabels:
192+ app: keycloak
193+ template:
194+ metadata:
195+ labels:
196+ app: keycloak
197+ spec:
198+ containers:
199+ - name: keycloak
200+ image: quay.io/keycloak/keycloak:23.0.4
201+ args: ["start-dev"]
202+ env:
203+ - name: KEYCLOAK_ADMIN
204+ value: admin
205+ - name: KEYCLOAK_ADMIN_PASSWORD
206+ value: admin
207+ ports:
208+ - containerPort: 8080
209+ readinessProbe:
210+ httpGet:
211+ path: /
212+ port: 8080
213+ initialDelaySeconds: 20
214+ periodSeconds: 5
215+ failureThreshold: 6
216+ ---
217+ apiVersion: v1
218+ kind: Service
219+ metadata:
220+ name: keycloak
221+ namespace: keycloak
222+ spec:
223+ selector:
224+ app: keycloak
225+ ports:
226+ - port: 8080
227+ targetPort: 8080
228+ EOF
229+
230+ # Wait for Keycloak readiness
231+ - name : Wait for Keycloak readiness
232+ run : |
233+ kubectl -n keycloak rollout status deploy/keycloak --timeout=2m
234+ kubectl -n keycloak get pods -o wide
235+
236+ # Configure Keycloak realm, client, and user
237+ - name : Configure Keycloak realm, client, and user
238+ run : |
239+ kubectl -n keycloak exec deploy/keycloak -- \
240+ /opt/keycloak/bin/kcadm.sh config credentials \
241+ --server http://localhost:8080 --realm master \
242+ --user admin --password admin
243+
244+ kubectl -n keycloak exec deploy/keycloak -- \
245+ /opt/keycloak/bin/kcadm.sh create realms -s realm=test -s enabled=true
246+
247+ kubectl -n keycloak exec deploy/keycloak -- \
248+ /opt/keycloak/bin/kcadm.sh create clients -r test \
249+ -s clientId=vertica -s enabled=true \
250+ -s secret=P9f8350QQIUhFfK1GF5sMhq4Dm3P6Sbs \
251+ -s 'redirectUris=["*"]' \
252+ -s directAccessGrantsEnabled=true
253+
254+ kubectl -n keycloak exec deploy/keycloak -- \
255+ /opt/keycloak/bin/kcadm.sh create users -r test \
256+ -s username=oauth_user -s enabled=true
257+
258+ kubectl -n keycloak exec deploy/keycloak -- \
259+ /opt/keycloak/bin/kcadm.sh set-password -r test \
260+ --username oauth_user --new-password password
261+
262+ # Configure Vertica Authentication
263+ - name : Configure Vertica Authentication
264+ run : |
265+ NS=my-verticadb-operator
266+ POD=verticadb-sample-defaultsubcluster-0
267+ kubectl -n ${NS} exec ${POD} -c server -- bash -c "
268+ /opt/vertica/bin/vsql -U dbadmin -c \"
269+ CREATE AUTHENTICATION v_oauth METHOD 'oauth' HOST '0.0.0.0/0';
270+ ALTER AUTHENTICATION v_oauth SET client_id = 'vertica';
271+ ALTER AUTHENTICATION v_oauth SET client_secret = 'P9f8350QQIUhFfK1GF5sMhq4Dm3P6Sbs';
272+ ALTER AUTHENTICATION v_oauth SET discovery_url = 'http://keycloak.keycloak.svc.cluster.local:8080/realms/test/.well-known/openid-configuration';
273+ ALTER AUTHENTICATION v_oauth SET introspect_url = 'http://keycloak.keycloak.svc.cluster.local:8080/realms/test/protocol/openid-connect/token/introspect';
274+ CREATE USER oauth_user;
275+ GRANT AUTHENTICATION v_oauth TO oauth_user;
276+ GRANT ALL ON SCHEMA PUBLIC TO oauth_user;
277+ CREATE AUTHENTICATION v_dbadmin_hash METHOD 'hash' HOST '0.0.0.0/0';
278+ ALTER AUTHENTICATION v_dbadmin_hash PRIORITY 10000;
279+ GRANT AUTHENTICATION v_dbadmin_hash TO dbadmin;
280+ \"
281+ "
92282
93283 - name : Install dependencies
94284 run : pip install tox
285+
95286 - name : Run tests
96287 run : |
97288 export VP_TEST_USER=dbadmin
98- export VP_TEST_OAUTH_ACCESS_TOKEN=` cat access_token.txt`
289+ export VP_TEST_OAUTH_ACCESS_TOKEN=$( cat access_token.txt)
99290 export VP_TEST_OAUTH_USER=${USER}
100291 tox -e py
292+ kubectl -n ${NS} delete pod go-test-runner --ignore-not-found=true
293+
294+ # Cleanup MinIO
295+ - name : Uninstall MinIO
296+ if : always()
297+ run : |
298+ kubectl delete pod minio -n minio --ignore-not-found || true
299+ kubectl delete svc minio -n minio --ignore-not-found || true
300+ kubectl delete ns minio || true
301+ echo "MinIO cleanup complete"
0 commit comments