Skip to content

Commit c9de4d8

Browse files
committed
feat(integration): INT-05 Odoo OIDC docker test + CI
- docker/odoo-ldap-seed.ldif: FreeIPA-style seed (odooadmin/odoouser1/ odoouser2, pw: Lab05Password!; groups: admins + odoo-users) - docker/docker-compose.integration.yml: odoo-int-ldap-seed init service; Keycloak depends_on seed_completed; LDAP BaseDN -> cn=users,cn=accounts; Keycloak OIDC env vars added (KEYCLOAK_URL/REALM/CLIENT_ID) - tests/labs/test-lab-13-05.sh: INT-05 full test (LDAP seed verify; KC realm/federation/sync/users; OIDC client; Odoo JSON-RPC auth + provider check; OIDC token/userinfo/introspect); removed duplicate dead-code stub - .github/workflows/ci.yml: lab-05-smoke -> INT-05; python3 added; wait order: PostgreSQL -> OpenLDAP -> ldap-seed -> WireMock -> KC(240s) -> Odoo
1 parent 29c7e8a commit c9de4d8

4 files changed

Lines changed: 429 additions & 83 deletions

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,24 +190,28 @@ jobs:
190190
run: docker compose -f docker/docker-compose.sso.yml down -v
191191

192192
lab-05-smoke:
193-
name: Lab 05 -- Odoo Advanced Integration (WireMock Snipe-IT REST + SuiteCRM sync)
193+
name: Lab 05 -- Odoo Advanced Integration (INT-05 Odoo↔Keycloak OIDC + WireMock)
194194
runs-on: ubuntu-latest
195195
needs: validate
196196
continue-on-error: true
197197
steps:
198198
- uses: actions/checkout@v4
199199
- name: Install tools
200-
run: sudo apt-get install -y curl postgresql-client netcat-openbsd ldap-utils
200+
run: sudo apt-get install -y curl postgresql-client netcat-openbsd ldap-utils python3
201201
- name: Validate integration compose
202202
run: docker compose -f docker/docker-compose.integration.yml config -q && echo "Integration compose valid"
203203
- name: Start integration stack
204204
run: docker compose -f docker/docker-compose.integration.yml up -d
205205
- name: Wait for PostgreSQL
206206
run: timeout 120 bash -c 'until docker exec odoo-i05-db pg_isready -U odoo; do sleep 5; done'
207+
- name: Wait for OpenLDAP
208+
run: timeout 120 bash -c 'until docker exec odoo-i05-ldap ldapsearch -x -H ldap://localhost -b dc=lab,dc=local -D cn=admin,dc=lab,dc=local -w LdapLab05! cn=admin >/dev/null 2>&1; do sleep 5; done'
209+
- name: Wait for LDAP seed
210+
run: timeout 60 bash -c 'until docker inspect odoo-int-ldap-seed --format "{{.State.Status}}" 2>/dev/null | grep -q exited; do sleep 5; done'
207211
- name: Wait for WireMock
208212
run: timeout 60 bash -c 'until curl -sf http://localhost:8372/__admin/health; do sleep 5; done'
209213
- name: Wait for Keycloak
210-
run: timeout 300 bash -c 'until curl -sf http://localhost:8470/realms/master; do sleep 10; done'
214+
run: timeout 240 bash -c 'until curl -sf http://localhost:8470/realms/master; do sleep 10; done'
211215
- name: Wait for Mailhog
212216
run: timeout 60 bash -c 'until curl -sf http://localhost:8670/api/v2/messages; do sleep 5; done'
213217
- name: Wait for Odoo web

docker/docker-compose.integration.yml

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414
# + WireMock also mocks SuiteCRM JSONRPC (customer sync partner)
1515
# + Odoo integration env vars: SNIPEIT_URL, SNIPEIT_TOKEN, SUITECRM_URL
1616
# + Redis retained for Odoo session cache
17-
# Integration tested: Odoo ↔ Snipe-IT (asset procurement), Odoo ↔ SuiteCRM (customer sync)
17+
# Integration tested: Odoo ↔ Keycloak OIDC (INT-05) · Odoo ↔ Snipe-IT (asset procurement) · Odoo ↔ SuiteCRM (customer sync)
18+
# =============================================================================
19+
# INT-05 additions:
20+
# + odoo-int-ldap-seed: init container — loads FreeIPA-style LDIF (odooadmin/odoouser1/odoouser2)
21+
# + Keycloak depends on seed completion for LDAP federation to find pre-seeded users
22+
# + LDAP_BASE_DN updated to cn=users,cn=accounts,dc=lab,dc=local (FreeIPA tree)
1823
# =============================================================================
1924

2025
name: it-stack-odoo-lab05
@@ -97,6 +102,27 @@ services:
97102
memory: 256M
98103
cpus: "0.25"
99104

105+
# ── LDAP seed (INT-05) ──────────────────────────────────────────────────
106+
odoo-int-ldap-seed:
107+
image: osixia/openldap:1.5.0
108+
container_name: odoo-int-ldap-seed
109+
restart: no
110+
entrypoint: >
111+
/bin/bash -c
112+
"sleep 8 &&
113+
ldapadd -x -H ldap://odoo-i05-ldap:389
114+
-D 'cn=admin,dc=lab,dc=local'
115+
-w LdapLab05!
116+
-f /ldif/odoo-ldap-seed.ldif &&
117+
echo 'SEED_COMPLETE'"
118+
volumes:
119+
- ./odoo-ldap-seed.ldif:/ldif/odoo-ldap-seed.ldif:ro
120+
depends_on:
121+
odoo-i05-ldap:
122+
condition: service_healthy
123+
networks:
124+
- odoo-i05-net
125+
100126
# ── Keycloak ─────────────────────────────────────────────────────────────
101127
odoo-i05-kc:
102128
image: quay.io/keycloak/keycloak:24.0.3
@@ -113,6 +139,9 @@ services:
113139
KC_HTTP_ENABLED: "true"
114140
ports:
115141
- "8470:8080"
142+
depends_on:
143+
odoo-int-ldap-seed:
144+
condition: service_completed_successfully
116145
healthcheck:
117146
test: ["CMD-SHELL", "curl -sf http://localhost:8080/realms/master || exit 1"]
118147
interval: 15s
@@ -188,11 +217,13 @@ services:
188217
PORT: "5432"
189218
USER: odoo
190219
PASSWORD: OdooLab05!
191-
# LDAP integration
220+
# LDAP integration (FreeIPA-style tree — seeded by odoo-int-ldap-seed)
192221
LDAP_HOST: odoo-i05-ldap
193222
LDAP_PORT: "389"
194-
LDAP_BASE_DN: dc=lab,dc=local
223+
LDAP_BASE_DN: cn=users,cn=accounts,dc=lab,dc=local
195224
LDAP_FILTER: (uid=%s)
225+
LDAP_BIND_DN: cn=readonly,dc=lab,dc=local
226+
LDAP_BIND_PASSWORD: ReadOnly05!
196227
LDAP_ADMIN_DN: cn=admin,dc=lab,dc=local
197228
LDAP_ADMIN_PASSWORD: LdapLab05!
198229
# Keycloak OIDC

docker/odoo-ldap-seed.ldif

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# odoo-ldap-seed.ldif
2+
# FreeIPA-style LDAP seed for Odoo Lab 05 (INT-05: Odoo↔Keycloak OIDC)
3+
# Tree: cn=accounts,dc=lab,dc=local
4+
# Users: odooadmin · odoouser1 · odoouser2 (pw: Lab05Password!)
5+
# Groups: cn=admins · cn=odoo-users
6+
7+
# ── Organizational units (FreeIPA-style) ─────────────────────────────────────
8+
dn: cn=accounts,dc=lab,dc=local
9+
objectClass: top
10+
objectClass: nsContainer
11+
cn: accounts
12+
13+
dn: cn=users,cn=accounts,dc=lab,dc=local
14+
objectClass: top
15+
objectClass: nsContainer
16+
cn: users
17+
18+
dn: cn=groups,cn=accounts,dc=lab,dc=local
19+
objectClass: top
20+
objectClass: nsContainer
21+
cn: groups
22+
23+
# ── Users ────────────────────────────────────────────────────────────────────
24+
dn: uid=odooadmin,cn=users,cn=accounts,dc=lab,dc=local
25+
objectClass: top
26+
objectClass: inetOrgPerson
27+
objectClass: organizationalPerson
28+
objectClass: person
29+
uid: odooadmin
30+
cn: Odoo Admin
31+
sn: Admin
32+
givenName: Odoo
33+
mail: odooadmin@lab.local
34+
userPassword: Lab05Password!
35+
description: Odoo ERP administrator — lab seed account
36+
37+
dn: uid=odoouser1,cn=users,cn=accounts,dc=lab,dc=local
38+
objectClass: top
39+
objectClass: inetOrgPerson
40+
objectClass: organizationalPerson
41+
objectClass: person
42+
uid: odoouser1
43+
cn: Odoo User One
44+
sn: User One
45+
givenName: Odoo
46+
mail: odoouser1@lab.local
47+
userPassword: Lab05Password!
48+
description: Odoo ERP standard user — lab seed account
49+
50+
dn: uid=odoouser2,cn=users,cn=accounts,dc=lab,dc=local
51+
objectClass: top
52+
objectClass: inetOrgPerson
53+
objectClass: organizationalPerson
54+
objectClass: person
55+
uid: odoouser2
56+
cn: Odoo User Two
57+
sn: User Two
58+
givenName: Odoo
59+
mail: odoouser2@lab.local
60+
userPassword: Lab05Password!
61+
description: Odoo ERP standard user — lab seed account
62+
63+
# ── Groups ───────────────────────────────────────────────────────────────────
64+
dn: cn=admins,cn=groups,cn=accounts,dc=lab,dc=local
65+
objectClass: top
66+
objectClass: groupOfNames
67+
cn: admins
68+
description: Odoo ERP administrators group
69+
member: uid=odooadmin,cn=users,cn=accounts,dc=lab,dc=local
70+
71+
dn: cn=odoo-users,cn=groups,cn=accounts,dc=lab,dc=local
72+
objectClass: top
73+
objectClass: groupOfNames
74+
cn: odoo-users
75+
description: Odoo ERP standard users group
76+
member: uid=odoouser1,cn=users,cn=accounts,dc=lab,dc=local
77+
member: uid=odoouser2,cn=users,cn=accounts,dc=lab,dc=local

0 commit comments

Comments
 (0)