|
8 | 8 | runs-on: ubuntu-latest |
9 | 9 | strategy: |
10 | 10 | matrix: |
11 | | - python-version: ['2.7', '3.7', '3.8', '3.9', '3.10', 'pypy-3.9'] |
| 11 | + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', 'pypy3.10'] |
| 12 | + |
| 13 | + env: |
| 14 | + REALM: test |
| 15 | + USER: oauth_user |
| 16 | + PASSWORD: password |
| 17 | + CLIENT_ID: vertica |
| 18 | + CLIENT_SECRET: P9f8350QQIUhFfK1GF5sMhq4Dm3P6Sbs |
12 | 19 |
|
13 | 20 | steps: |
14 | 21 | - name: Check out repository |
15 | | - uses: actions/checkout@v2 |
| 22 | + uses: actions/checkout@v4 |
16 | 23 | - name: Set up Python ${{ matrix.python-version }} |
17 | | - uses: actions/setup-python@v2 |
| 24 | + uses: actions/setup-python@v5 |
18 | 25 | with: |
19 | 26 | python-version: ${{ matrix.python-version }} |
20 | | - - name: Set up a Vertica server |
21 | | - env: |
22 | | - VERTICA_CE_URL: "https://vertica-community-edition-for-testing.s3.amazonaws.com/XCz9cp7m/vertica-12.0.0-0.x86_64.RHEL6.rpm" |
| 27 | + - name: Set up a Keycloak docker container |
| 28 | + timeout-minutes: 5 |
| 29 | + 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 |
| 39 | + 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 |
23 | 53 | run: | |
24 | | - git clone https://github.com/jbfavre/docker-vertica.git |
25 | | - curl $VERTICA_CE_URL --create-dirs -o docker-vertica/packages/vertica-ce.latest.rpm |
26 | | - docker build -f docker-vertica/Dockerfile.centos.7_9.x --build-arg VERTICA_PACKAGE=vertica-ce.latest.rpm -t jbfavre/vertica docker-vertica |
27 | | - docker images |
28 | | - docker run -d -p 5433:5433 jbfavre/vertica |
29 | | - sleep 60 |
| 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 |
| 67 | + EOF |
| 68 | +
|
| 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;" |
| 92 | +
|
30 | 93 | - name: Install dependencies |
31 | 94 | run: pip install tox |
32 | 95 | - name: Run tests |
33 | 96 | run: | |
34 | 97 | export VP_TEST_USER=dbadmin |
| 98 | + export VP_TEST_OAUTH_ACCESS_TOKEN=`cat access_token.txt` |
| 99 | + export VP_TEST_OAUTH_USER=${USER} |
35 | 100 | tox -e py |
0 commit comments