Skip to content
This repository was archived by the owner on Sep 17, 2024. It is now read-only.

Commit 66d399a

Browse files
authored
fix: add resiliency when an integration cannot be added to a policy (#1914)
* chore: do not exit if the integration cannot be added to the policy * chore: add resiliency when adding an integration to a policy We have detected 500 codes in the staging environment of package-registry [2021-12-16T05:41:55.069Z] FATA[2021-12-16T05:41:53Z] Unable to add integration to policy err="could not add package to policy; API status code = 500; response body = {\"statusCode\":500,\"error\":\"Internal Server Error\",\"message\":\"'502 Bad Gateway' error response from package registry at https://epr-staging.elastic.co/package/endpoint/1.4.0\"}" packageDS="{ endpoint-50fff084-9495-4633-b1a7-0a817b61d6bc Endpoint Security default cdd3d370-5e32-11ec-9ece-534be1f506d0 true [] { endpoint Endpoint Security 1.4.0}}" * fix: add missing return * fix: format source
1 parent 1b04d82 commit 66d399a

2 files changed

Lines changed: 60 additions & 13 deletions

File tree

e2e/_suites/fleet/fleet.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,8 @@ func theIntegrationIsOperatedInThePolicy(ctx context.Context, client *kibana.Cli
10101010
log.WithFields(log.Fields{
10111011
"err": err,
10121012
"packageDS": packageDataStream,
1013-
}).Fatal("Unable to add integration to policy")
1013+
}).Error("Unable to add integration to policy")
1014+
return err
10141015
}
10151016
} else if strings.ToLower(action) == actionREMOVED {
10161017
packageDataStream, err := client.GetIntegrationFromAgentPolicy(ctx, integration.Name, policy)

internal/kibana/integrations.go

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import (
55
"encoding/json"
66
"fmt"
77
"strings"
8+
"time"
89

910
"github.com/Jeffail/gabs/v2"
11+
"github.com/cenkalti/backoff/v4"
12+
"github.com/elastic/e2e-testing/internal/utils"
1013
"github.com/pkg/errors"
1114
log "github.com/sirupsen/logrus"
1215
"go.elastic.co/apm"
@@ -22,24 +25,67 @@ type IntegrationPackage struct {
2225

2326
// AddIntegrationToPolicy adds an integration to policy
2427
func (c *Client) AddIntegrationToPolicy(ctx context.Context, packageDS PackageDataStream) error {
25-
span, _ := apm.StartSpanOptions(ctx, "Adding integration to policy", "fleet.package.add-to-policy", apm.SpanOptions{
26-
Parent: apm.SpanFromContext(ctx).TraceContext(),
27-
})
28-
defer span.End()
28+
maxTimeout := time.Duration(utils.TimeoutFactor) * time.Minute
29+
retryCount := 1
2930

30-
reqBody, err := json.Marshal(packageDS)
31-
if err != nil {
32-
return errors.Wrap(err, "could not convert policy-package (request) to JSON")
31+
exp := utils.GetExponentialBackOff(maxTimeout)
32+
33+
addIntegrationFn := func() error {
34+
span, _ := apm.StartSpanOptions(ctx, "Adding integration to policy", "fleet.package.add-to-policy", apm.SpanOptions{
35+
Parent: apm.SpanFromContext(ctx).TraceContext(),
36+
})
37+
defer span.End()
38+
39+
reqBody, err := json.Marshal(packageDS)
40+
if err != nil {
41+
log.WithFields(log.Fields{
42+
"elapsedTime": exp.GetElapsedTime(),
43+
"err": err,
44+
"package": packageDS,
45+
"retry": retryCount,
46+
}).Warn("Could not convert policy-package (request) to JSON. Retrying")
47+
48+
retryCount++
49+
50+
return err
51+
}
52+
53+
statusCode, respBody, err := c.post(ctx, fmt.Sprintf("%s/package_policies", FleetAPI), reqBody)
54+
if err != nil {
55+
log.WithFields(log.Fields{
56+
"elapsedTime": exp.GetElapsedTime(),
57+
"err": err,
58+
"package": packageDS,
59+
"retry": retryCount,
60+
}).Warn("Could not add package to policy. Retrying")
61+
62+
retryCount++
63+
64+
return err
65+
}
66+
67+
if statusCode != 200 {
68+
log.WithFields(log.Fields{
69+
"elapsedTime": exp.GetElapsedTime(),
70+
"err": err,
71+
"statusCode": statusCode,
72+
"response": respBody,
73+
"package": packageDS,
74+
"retry": retryCount,
75+
}).Warn("could not add package to policy because of HTTP code is not 200")
76+
77+
retryCount++
78+
return fmt.Errorf("could not add package to policy; API status code = %d; response body = %s", statusCode, respBody)
79+
}
80+
81+
return nil
3382
}
3483

35-
statusCode, respBody, err := c.post(ctx, fmt.Sprintf("%s/package_policies", FleetAPI), reqBody)
84+
err := backoff.Retry(addIntegrationFn, exp)
3685
if err != nil {
37-
return errors.Wrap(err, "could not add package to policy")
86+
return err
3887
}
3988

40-
if statusCode != 200 {
41-
return fmt.Errorf("could not add package to policy; API status code = %d; response body = %s", statusCode, respBody)
42-
}
4389
return nil
4490
}
4591

0 commit comments

Comments
 (0)