Do not log error if missing EULA (#31598)

fixes #29833 

Checks if the error is a not found error and then return a notFoundError
that does not get logged as an error but as an info log instead.

`level=info ts=2025-08-05T10:46:06.237581Z component=http
path=/api/latest/fleet/setup_experience/eula/metadata took=1.939958ms
uuid=0ab0c579-07c5-48be-b6bd-5e4ebd81212d err="not found"`


# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually
This commit is contained in:
Magnus Jensen 2025-08-05 16:39:49 +02:00 committed by GitHub
parent 7ea3a39ee3
commit 893563777b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 47 additions and 2 deletions

View file

@ -0,0 +1 @@
* Do not log an error if EULA is missing for the `/setup_experience/eula/metadata` endpoint

View file

@ -13,6 +13,7 @@ import (
"time"
"github.com/fleetdm/fleet/v4/pkg/fleethttp"
"github.com/fleetdm/fleet/v4/server/datastore/redis/redistest"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/ptr"
"github.com/fleetdm/fleet/v4/server/service/contract"
@ -42,8 +43,15 @@ func (s *integrationLoggerTestSuite) SetupSuite() {
s.buf = new(bytes.Buffer)
logger := log.NewJSONLogger(s.buf)
logger = level.NewFilter(logger, level.AllowDebug())
redisPool := redistest.SetupRedis(s.T(), "zz", false, false, false)
users, server := RunServerForTestsWithDS(s.T(), s.ds, &TestServerOpts{Logger: logger})
users, server := RunServerForTestsWithDS(s.T(), s.ds, &TestServerOpts{
License: &fleet.LicenseInfo{
Tier: fleet.TierPremium,
},
Logger: logger,
Pool: redisPool,
})
s.server = server
s.users = users
}
@ -304,3 +312,34 @@ func (s *integrationLoggerTestSuite) TestEnrollAgentLogsErrors() {
assert.Contains(t, string(logData["err"]), `"enroll failed:`)
assert.Contains(t, string(logData["err"]), `no matching secret found`)
}
func (s *integrationLoggerTestSuite) TestSetupExperienceEULAMetadataDoesNotLogErrorIfNotFound() {
t := s.T()
appConf, err := s.ds.AppConfig(context.Background())
require.NoError(s.T(), err)
originalAppConf := *appConf
appConf.MDM.EnabledAndConfigured = true
appConf.MDM.WindowsEnabledAndConfigured = true
appConf.MDM.AppleBMEnabledAndConfigured = true
err = s.ds.SaveAppConfig(context.Background(), appConf)
require.NoError(t, err)
s.token = getTestAdminToken(t, s.server)
s.Do("GET", "/api/v1/fleet/setup_experience/eula/metadata", nil, http.StatusNotFound)
logs := strings.Split(strings.TrimSpace(s.buf.String()), "\n")
require.Len(t, logs, 2) // Login and not found
logData := make(map[string]json.RawMessage)
log := logs[1]
assert.NoError(t, json.Unmarshal([]byte(log), &logData))
assert.Equal(t, `"info"`, string(logData["level"]))
assert.Equal(t, string(logData["err"]), `"not found"`)
// restore app config
err = s.ds.SaveAppConfig(context.Background(), &originalAppConf)
require.NoError(t, err)
}

View file

@ -368,10 +368,15 @@ func (r getMDMEULAMetadataResponse) Error() error { return r.Err }
func getMDMEULAMetadataEndpoint(ctx context.Context, request interface{}, svc fleet.Service) (fleet.Errorer, error) {
eula, err := svc.MDMGetEULAMetadata(ctx)
if err != nil {
if err != nil && !fleet.IsNotFound(err) {
return getMDMEULAMetadataResponse{Err: err}, nil
}
if eula == nil {
// We return the error here not as part of the response object, to signal an error to the server, but avoid logging it as an error.
return nil, newNotFoundError()
}
return getMDMEULAMetadataResponse{MDMEULA: eula}, nil
}