Commit Graph
206 Commits
Author SHA1 Message Date
Pascal Bleser 5b72318493 chore(graph): add metrics for HTTP API and LDAP
Introducing gowrap as a build-time tool to generate interface delegate
structs from templates:

 * added as a 'make go-generate' target in services/graph,
 * added as a build-time dependency in .bingo/

Introduce an LDAP client abstraction interface to be able to wrap the
go-ldap client API with metrics transparently (and possibly hooks and
such in the future), in order to use delegation patterns to measure the
time LDAP (client) operations take to finish, as well as to track their
results (success, failure, not-found).

Has two implementations that are generated using gowrap:

* a go-ldap adapter implementation that directly delegates to a go-ldap
  connection
* a time measuring and metrics collecting implementation that delegates
  to another LdapClient

The metrics collecting one is disabled by default, can be enabled with
GRAPH_LDAP_METRICS_DISABLE=false

It collects durations of outbound LDAP client operations into a histogram, as
well as the number of concurrent outbound LDAP operations in a gauge (via an
atomic int and a gauge function, as that performs best).

Add an HTTP middleware that measures how long Graph HTTP API requests
take, storing taken time into a histogram along with labels for

 * method,
 * path pattern (from the chi routes),
 * Graph API version prefix,
 * Graph API resource name,
 * and the resulting status code.

It also tracks the number of concurrent inbound Graph API HTTP requests
using a gauge (also using an atomic int and a gauge function).

Disabled by default, can be enabled with
GRAPH_HTTP_METRICS_DISABLE=false

Add Backend and EducationBackend delegate implementations that measure
execution time on the level of the higher API call operations there
(CreateUser, DeleteUser, ..., CreateSchool, ...), generated using
gowrap.

Disabled by default, can be enabled with
GRAPH_IDENTITY_BACKEND_METRICS_DISABLE=false

Also added a small k6 script to produce some read-only load on the Graph
API, for a casual test of the metrics, as well as k6 in mise.toml.

Make an internal changes to how singular LDAP entry searches work in the LDAP
identity backends:

 * check whether searches for a singular entry returns more than one
   result, in which case a new error TooManyResults is returned, instead
   of leaving that undetected, blindly taking the first result, and
   potentially risking data inconsistencies

Improve the loggers in identity backends by adding attributes for their
request targets (Reva gateway address or LDAP URI, respectively).

Also add a "backend" attribute for all Graph API logs (set to "ldap" or
"cs3"), to help debug potential issues, and remove them from all the logger
debug calls at the beginning of each LDAP-related function as those should
really be part of the logger and set beforehand.

The LDAP identity backend logger also has two new attributes to help
debugging with logs:

 * write (bool): whether write operations are enabled
 * refint (bool): whether refint is enabled or not

Also adds a dedicated counter metric for user password change operations.

Minor campfire improvements:

 * add a constructor func for the CS3 backend

 * add a constructor func for the LDAP backend

 * in the LDAP identity backend, in searchLDAPEntryByFilter (used by all
   search/get public functions), errors that occur when performing LDAP
   SEARCH operations were blindly mapped to a ItemNotFound error,
   instead of being analyzed as it could be caused by a technical error

 * in the requireadmin middleware, add debug logging to explain why a
   request is denied

 * when an LDAP password change fails because the user entry was not
   found in LDAP, we now have a log message that tracks that
2026-09-01 10:57:47 +02:00
Pascal Bleser e8cf677353 chore(graph): disable HTTP or eventhandlers by configuration
In the scope of the broader issue #1312, this PR deals with performing
those changes for the `graph` service, namely to add the ability to
disable the HTTP API or to disable the events API handler by
configuration.

It also adds metrics for the events processing, and tests for the events
processing.

The previous implementation was combining the HTTP server service and
the events consumption, which is why this PR refactors the composition
of those services:

 * the event consumption has been moved into its own service
 * the identity.Backend is created beforehand, and then injected as a
   collaborator in both the HTTP service as well as the event consumer
   service

It also adds metrics, mainly for the event processing.

To encourage re-use in latter implementations and changes, it also
introduces two top-level package changes:

 * internal/eventstest/events_test_helpers: contains a TestBus
   implementation to unit-test event consumers without NATS
 * internal/metricstest/metrics_test_helpers: contains assertion
   functions to test Prometheus metrics
2026-09-01 10:57:26 +02:00
Pascal Bleser f034f2058f fix(graph): adding the same user as multiple members in a group (#3354)
* make sure the list of members to add to a group is unique, by
   removing duplicates in the inbound list of member IDs

 * not attempting to detect duplicate DNs as that should not be
   necessary, and results in an error with OpenLDAP; the built-in IDM
   does not catch those as of now but the issue is tracked there, and
   should not happen due to the UUID filtering in this commit

 * remove the corresponding failing test from the list of expected
   failures

Fixes 3354
2026-08-20 08:11:49 +02:00
Christian Richter 1462301116 incorporate requested changes
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2026-05-20 14:14:00 +02:00
Christian Richter 0351adfe6b change logger level
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2026-05-20 14:14:00 +02:00
Florian Schade 288e67cc39 chore: replace interface with any 2026-04-23 09:31:11 +02:00
André Duffeck e51ee6d229 Adapt to cs3api changes 2026-03-06 14:59:30 +01:00
Ralf Haferkamp fe3befd172 chore(graph/education): deduplicate LDAP Search result processing 2026-03-04 15:36:22 +01:00
Ralf Haferkamp 9f7b42586b chore(graph/education): reduce complexity and duplication 2026-03-04 15:14:30 +01:00
Ralf Haferkamp 020a37b017 feat(graph): replace externalId school lookup with OData $filter support
Remove the ability to look up schools by externalId directly (from LDAP
filters, duplicate checks, and the EducationBackend interface). This
approach was somewhat unclean, we shouldn't add more an more attributes
as keys for direct lookup.

Instead, expose externalId filtering via the OData $filter query
parameter on GET /education/schools, following the same pattern as
for education users.

Related: #1598
2026-03-04 14:31:43 +01:00
Ralf Haferkamp 6f404096ce feat(graph/education): Add support of 'eq' filters on users
This adds support of simple OData filters on the 'education/users'
endpoint. Filters of the type '$filter=<attr> eq <value>' are supported
now for the following educationUser properties:

"displayname", "mail", "userType", "primaryRole" and "externalId"

Closes: #1599
2026-03-04 13:51:42 +01:00
Ralf Haferkamp 5065a67891 feat(graph/edu): Add externalID user property 2026-03-04 13:51:42 +01:00
Christian Richter 6f7160556f fix tests
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2026-02-10 10:45:09 +01:00
Christian RichterandRalf Haferkamp 7d5d8f3484 adapt graph service
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
Co-authored-by: Ralf Haferkamp <r.haferkamp@opencloud.eu>
2026-02-10 10:45:09 +01:00
Christian Richter 5877bfa8a2 initial skel for external tenant id
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2026-02-10 10:45:09 +01:00
Viktor ScharfandJörn Friedrich Dreyer 2bdd98f5cf [full-ci] revaBump-v2.40.1 (#1927)
* revaBump-v2.40.0

* adapt tests

* bring-#442

* adapt tests

* bring-#444

* ocm fixes

Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>

* adapt tests

* adapt unit tests

Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>

* revaUpdate-2.40.1

* update opencloud-version-4.0.0-rc.3

---------

Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
Co-authored-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-11-28 17:34:12 +01:00
Jörn Friedrich Dreyer 52d31ca8ef log missing name or id attributes (#1914)
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-11-26 08:06:05 +01:00
Jörn Friedrich Dreyer 4340cdc9e6 handle objectguid endianess
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-11-24 15:53:41 +01:00
Christian Richter acc38eb739 Merge pull request #1732 from dragonchaser/make-user-cache-tenant-aware
make user cache tenant aware
2025-11-13 10:45:18 +01:00
Christian Richter 2189edaa17 remove obsolete code
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-12 17:52:29 +01:00
Christian Richter 28fdfded71 incorporate requested changes
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-12 17:50:28 +01:00
Mikel Olasagasti Uranga 06b78b8261 chore: drop gofrs/uuid module usage and use google/uuid
Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
2025-11-12 11:47:13 +01:00
Christian Richter 7fe511d6df fix test and check in return
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter c3d7560652 rewrite test with multiple users
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter ae37684a79 fix GetUserTest without tennantId
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter 26da21abe7 change key of the cache
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter e112ac7721 move idendity cache to subpackage
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter 5af51b089f add tests
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter 8ffabad1e4 check tennantId
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Christian Richter 1404c69597 change function headers & calls
Signed-off-by: Christian Richter <c.richter@opencloud.eu>
2025-11-06 18:01:58 +01:00
Ralf Haferkamp 28ec9c3282 graph(education): Make 'schoolNumber' attribute optional
It's already optional in the spec. For mulit-tenant provisioning
we want it to be optional as well.

Related: #1597
2025-10-28 12:56:42 +01:00
Shawn Wilsher 920a6916c4 fix: only search LDAP group by name 2025-10-28 10:22:54 +01:00
Ralf Haferkamp 98d773bb9b fix: adjust for CS3 api change
see: https://github.com/cs3org/cs3apis/pull/247
2025-09-23 09:36:17 +02:00
Ralf Haferkamp a5e0c1ec4b fix(graph): Set the full CS3 user id in the Create Share request
Up to now we only set the OpaqueId attribute, which breaks sharing as soon as
multi-tenancy is enabled. We need the full UserId (including the
tenantId and the idp value).

Related Issue: #1194
2025-09-09 15:10:28 +02:00
Ralf Haferkamp 07b97fa7ac revert(partial): "Filter users by tenant, add tenant ids to demo users"
This reverts parts of commit 926a2c2080.

The LDAP identity backend of the graph service was supposed to stay single-tenant
only. The focus for multi-tenancy should be on the CS3 identity backend.

Also lets keep the internal IDM and demo users clean of any
multi-tenancy stuff for now.
2025-09-04 08:47:19 +02:00
André Duffeck b9f48edd87 Try to find users by username or id, just like the ldap backend does 2025-08-05 17:10:59 +02:00
André Duffeck 926a2c2080 Filter users by tenant, add tenant ids to demo users 2025-08-05 17:10:59 +02:00
06kellyjac 2a3a20693a build: Modify mockery config to work with v3
Maintaining the positioning of the files from v2 to reduce cognitive
load.
Indentation of yaml files now matches `.editorconfig`.
All mock files regenerated.
Added empty `{}` following convention from `mockery init` etc.
Removed directory specification where it would already match.
2025-06-19 16:25:39 +01:00
Ralf Haferkamp 76b16765d8 cleanup: Avoid fetching group membership when not needed
Use the new GetUserNoGroups helper to lookup users without resolving
groupmemberships where possible.

Closes: #1005
2025-06-12 09:47:53 +02:00
Jörn Friedrich Dreyer 981e8fe5a3 do not automatically expand drive root permissions
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-06-02 15:17:32 +02:00
Ralf Haferkamp 00ff858f19 graph: move to reva's auto-reconnect LDAP client
To reduce code duplication
2025-05-20 17:44:27 +02:00
Ralf Haferkamp 3dc9c0cb9a Switch to opencloud-eu fork of libre-graph-api-go 2025-05-15 14:11:35 +02:00
Jörn Friedrich Dreyer 3c38a3e3ed fix mockery warnings
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-04-29 11:01:17 +02:00
Michael Barz 22fb783724 test: extract go bin 2025-03-13 14:04:14 +01:00
Ralf Haferkamp 2678d0bb89 Bump mockery to 2.53.0
Should fix build on go1.24. Also fix ci-go-generate step in multiarch
Dockerfile.

Closes: #289
2025-03-03 16:02:59 +01:00
Ralf Haferkamp 6b08fa51ee fixup! Bump go-ldap to latest release 2025-02-20 09:24:03 +01:00
Ralf Haferkamp 0d03092669 Bump go-ldap to latest release
To be able to build with latest reva again
2025-02-20 09:06:07 +01:00
Ralf Haferkamp 734a1dc76b Adjust educational LDAP Attribute and Objectclasses
This is largely untested and might need further adjustments, but should
be "good enough" to not block us for now.
2025-01-29 11:59:06 +01:00
Ralf Haferkamp 1c96633985 Adjust LDAP base DN in tests to dc=example,dc=org 2025-01-29 11:59:06 +01:00
Ralf Haferkamp 0716b40fa0 Adjust LDAP Schema for new name 2025-01-29 11:58:57 +01:00