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

Commit a457007

Browse files
authored
Merge pull request #181 from mdelapenya/remove-token
fix: use the status of the agent by hostname
2 parents 15d2db5 + 41cf3bf commit a457007

File tree

3 files changed

+140
-122
lines changed

3 files changed

+140
-122
lines changed

e2e/_suites/ingest-manager/fleet.go

Lines changed: 80 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type FleetTestSuite struct {
3636
ConfigID string // will be used to manage tokens
3737
CurrentToken string // current enrollment token
3838
CurrentTokenID string // current enrollment tokenID
39+
Hostname string // the hostname of the container
3940
}
4041

4142
func (fts *FleetTestSuite) contributeSteps(s *godog.Suite) {
@@ -64,8 +65,15 @@ func (fts *FleetTestSuite) anAgentIsDeployedToFleet() error {
6465
}
6566
fts.Cleanup = true
6667

68+
// get container hostname once
69+
hostname, err := getContainerHostname(containerName)
70+
if err != nil {
71+
return err
72+
}
73+
fts.Hostname = hostname
74+
6775
// enroll the agent with a new token
68-
tokenJSONObject, err := createFleetToken("name", fts.ConfigID)
76+
tokenJSONObject, err := createFleetToken("Test token for "+hostname, fts.ConfigID)
6977
if err != nil {
7078
return err
7179
}
@@ -132,23 +140,23 @@ func (fts *FleetTestSuite) setup() error {
132140
func (fts *FleetTestSuite) theAgentIsListedInFleetAsOnline() error {
133141
log.Debug("Checking agent is listed in Fleet as online")
134142

135-
agentsCount := 0.0
136143
maxTimeout := 10 * time.Second
137144
retryCount := 1
138145

139146
exp := e2e.GetExponentialBackOff(maxTimeout)
140147

141-
countAgentsFn := func() error {
142-
count, err := countOnlineAgents()
143-
if err != nil || count == 0 {
148+
agentOnlineFn := func() error {
149+
status, err := isAgentOnline(fts.Hostname)
150+
if err != nil || !status {
144151
if err == nil {
145152
err = fmt.Errorf("The Agent is not online yet")
146153
}
147154

148155
log.WithFields(log.Fields{
149-
"retry": retryCount,
150-
"onlineAgents": count,
151-
"elapsedTime": exp.GetElapsedTime(),
156+
"active": status,
157+
"elapsedTime": exp.GetElapsedTime(),
158+
"hostname": fts.Hostname,
159+
"retry": retryCount,
152160
}).Warn(err.Error())
153161

154162
retryCount++
@@ -157,25 +165,19 @@ func (fts *FleetTestSuite) theAgentIsListedInFleetAsOnline() error {
157165
}
158166

159167
log.WithFields(log.Fields{
160-
"elapsedTime": exp.GetElapsedTime(),
161-
"onlineAgents": count,
162-
"retries": retryCount,
168+
"active": status,
169+
"elapsedTime": exp.GetElapsedTime(),
170+
"hostname": fts.Hostname,
171+
"retries": retryCount,
163172
}).Info("The Agent is online")
164-
agentsCount = count
165173
return nil
166174
}
167175

168-
err := backoff.Retry(countAgentsFn, exp)
176+
err := backoff.Retry(agentOnlineFn, exp)
169177
if err != nil {
170178
return err
171179
}
172180

173-
if agentsCount != 1 {
174-
err = fmt.Errorf("There are %.0f online agents. We expected to have exactly one", agentsCount)
175-
log.Error(err.Error())
176-
return err
177-
}
178-
179181
return nil
180182
}
181183

@@ -268,23 +270,23 @@ func (fts *FleetTestSuite) theAgentIsUnenrolled() error {
268270
func (fts *FleetTestSuite) theAgentIsNotListedAsOnlineInFleet() error {
269271
log.Debug("Checking if the agent is not listed as online in Fleet")
270272

271-
agentsCount := 0.0
272273
maxTimeout := 10 * time.Second
273274
retryCount := 1
274275

275276
exp := e2e.GetExponentialBackOff(maxTimeout)
276277

277-
countAgentsFn := func() error {
278-
count, err := countOnlineAgents()
279-
if err != nil || count != 0 {
278+
agentOnlineFn := func() error {
279+
status, err := isAgentOnline(fts.Hostname)
280+
if err != nil || status {
280281
if err == nil {
281282
err = fmt.Errorf("The Agent is still online")
282283
}
283284

284285
log.WithFields(log.Fields{
285-
"retry": retryCount,
286-
"onlineAgents": count,
287-
"elapsedTime": exp.GetElapsedTime(),
286+
"active": status,
287+
"elapsedTime": exp.GetElapsedTime(),
288+
"hostname": fts.Hostname,
289+
"retry": retryCount,
288290
}).Warn(err.Error())
289291

290292
retryCount++
@@ -293,25 +295,19 @@ func (fts *FleetTestSuite) theAgentIsNotListedAsOnlineInFleet() error {
293295
}
294296

295297
log.WithFields(log.Fields{
296-
"elapsedTime": exp.GetElapsedTime(),
297-
"onlineAgents": count,
298-
"retries": retryCount,
298+
"active": status,
299+
"elapsedTime": exp.GetElapsedTime(),
300+
"hostname": fts.Hostname,
301+
"retries": retryCount,
299302
}).Info("The Agent is offline")
300-
agentsCount = count
301303
return nil
302304
}
303305

304-
err := backoff.Retry(countAgentsFn, exp)
306+
err := backoff.Retry(agentOnlineFn, exp)
305307
if err != nil {
306308
return err
307309
}
308310

309-
if agentsCount != 0 {
310-
err = fmt.Errorf("There are %.0f online agents. We expected to have none", agentsCount)
311-
log.Error(err.Error())
312-
return err
313-
}
314-
315311
return nil
316312
}
317313

@@ -335,18 +331,8 @@ func (fts *FleetTestSuite) theEnrollmentTokenIsRevoked() error {
335331
"tokenID": fts.CurrentTokenID,
336332
}).Debug("Revoking enrollment token")
337333

338-
revokeTokenURL := fleetEnrollmentTokenURL + "/" + fts.CurrentTokenID
339-
deleteReq := createDefaultHTTPRequest(revokeTokenURL)
340-
341-
body, err := curl.Delete(deleteReq)
334+
err := fts.removeToken()
342335
if err != nil {
343-
log.WithFields(log.Fields{
344-
"token": fts.CurrentToken,
345-
"tokenID": fts.CurrentTokenID,
346-
"body": body,
347-
"error": err,
348-
"url": revokeTokenURL,
349-
}).Error("Could revoke token")
350336
return err
351337
}
352338

@@ -390,6 +376,24 @@ func (fts *FleetTestSuite) anAttemptToEnrollANewAgentFails() error {
390376
return nil
391377
}
392378

379+
func (fts *FleetTestSuite) removeToken() error {
380+
revokeTokenURL := fleetEnrollmentTokenURL + "/" + fts.CurrentTokenID
381+
deleteReq := createDefaultHTTPRequest(revokeTokenURL)
382+
383+
body, err := curl.Delete(deleteReq)
384+
if err != nil {
385+
log.WithFields(log.Fields{
386+
"tokenID": fts.CurrentTokenID,
387+
"body": body,
388+
"error": err,
389+
"url": revokeTokenURL,
390+
}).Error("Could delete token")
391+
return err
392+
}
393+
394+
return nil
395+
}
396+
393397
// checkFleetConfiguration checks that Fleet configuration is not missing
394398
// any requirements and is read. To achieve it, a GET request is executed
395399
func checkFleetConfiguration() error {
@@ -425,23 +429,6 @@ func checkFleetConfiguration() error {
425429
return nil
426430
}
427431

428-
// countOnlineAgents extracts the number of agents in the online status
429-
// querying Fleet's agents endpoint
430-
func countOnlineAgents() (float64, error) {
431-
jsonResponse, err := getOnlineAgents()
432-
if err != nil {
433-
return 0, err
434-
}
435-
436-
agentsCount := jsonResponse.Path("total").Data().(float64)
437-
438-
log.WithFields(log.Fields{
439-
"count": agentsCount,
440-
}).Debug("Online agents retrieved")
441-
442-
return agentsCount, nil
443-
}
444-
445432
// createFleetConfiguration sends a POST request to Fleet forcing the
446433
// recreation of the configuration
447434
func createFleetConfiguration() error {
@@ -713,9 +700,9 @@ func getOnlineAgents() (*gabs.Container, error) {
713700
r := createDefaultHTTPRequest(fleetAgentsURL)
714701
// let's not URL encode the querystring, as it seems Kibana is not handling
715702
// the request properly, returning an 400 Bad Request error with this message:
716-
// [request query.page=1&perPage=20&showInactive=false]: definition for this key is missing
703+
// [request query.page=1&perPage=20&showInactive=true]: definition for this key is missing
717704
r.EncodeURL = false
718-
r.QueryString = fmt.Sprintf("page=1&perPage=20&showInactive=%t", false)
705+
r.QueryString = fmt.Sprintf("page=1&perPage=20&showInactive=%t", true)
719706

720707
body, err := curl.Get(r)
721708
if err != nil {
@@ -738,3 +725,29 @@ func getOnlineAgents() (*gabs.Container, error) {
738725

739726
return jsonResponse, nil
740727
}
728+
729+
// isAgentOnline extracts the status for an agent, identified by its hotname
730+
// It will wuery Fleet's agents endpoint
731+
func isAgentOnline(hostname string) (bool, error) {
732+
jsonResponse, err := getOnlineAgents()
733+
if err != nil {
734+
return false, err
735+
}
736+
737+
agents := jsonResponse.Path("list")
738+
739+
for _, agent := range agents.Children() {
740+
agentStatus := agent.Path("active").Data().(bool)
741+
agentHostname := agent.Path("local_metadata.host.hostname").Data().(string)
742+
if agentHostname == hostname {
743+
log.WithFields(log.Fields{
744+
"active": agentStatus,
745+
"hostname": hostname,
746+
}).Debug("Agent status retrieved")
747+
748+
return agentStatus, nil
749+
}
750+
}
751+
752+
return false, fmt.Errorf("The agent '" + hostname + "' was not found in Fleet")
753+
}

e2e/_suites/ingest-manager/ingest-manager_test.go

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
package main
66

77
import (
8+
"context"
89
"os"
910
"path"
11+
"strings"
1012
"time"
1113

1214
"github.com/cucumber/godog"
1315
"github.com/cucumber/messages-go/v10"
1416
"github.com/elastic/e2e-testing/cli/config"
17+
"github.com/elastic/e2e-testing/cli/docker"
1518
"github.com/elastic/e2e-testing/cli/services"
1619
"github.com/elastic/e2e-testing/e2e"
1720
log "github.com/sirupsen/logrus"
@@ -169,6 +172,14 @@ func IngestManagerFeatureContext(s *godog.Suite) {
169172
log.WithFields(log.Fields{
170173
"service": serviceName,
171174
}).Debug("Service removed from compose.")
175+
176+
err = imts.Fleet.removeToken()
177+
if err != nil {
178+
log.WithFields(log.Fields{
179+
"err": err,
180+
"tokenID": imts.Fleet.CurrentTokenID,
181+
}).Warn("The enrollment token could not be deleted")
182+
}
172183
}
173184
})
174185
}
@@ -238,22 +249,6 @@ func (imts *IngestManagerTestSuite) processStateOnTheHost(process string, state
238249
return nil
239250
}
240251

241-
func startAgent(profile string, serviceName string) error {
242-
cmd := []string{"elastic-agent", "run"}
243-
err := execCommandInService(profile, serviceName, cmd, true)
244-
if err != nil {
245-
log.WithFields(log.Fields{
246-
"command": cmd,
247-
"error": err,
248-
"service": serviceName,
249-
}).Error("Could not run the agent")
250-
251-
return err
252-
}
253-
254-
return nil
255-
}
256-
257252
func execCommandInService(profile string, serviceName string, cmds []string, detach bool) error {
258253
serviceManager := services.NewServiceManager()
259254

@@ -281,3 +276,49 @@ func execCommandInService(profile string, serviceName string, cmds []string, det
281276

282277
return nil
283278
}
279+
280+
// we need the container name because we use the Docker Client instead of Docker Compose
281+
func getContainerHostname(containerName string) (string, error) {
282+
log.WithFields(log.Fields{
283+
"containerName": containerName,
284+
}).Debug("Retrieving container name from the Docker client")
285+
286+
hostname, err := docker.ExecCommandIntoContainer(context.Background(), containerName, "root", []string{"hostname"})
287+
if err != nil {
288+
log.WithFields(log.Fields{
289+
"containerName": containerName,
290+
"error": err,
291+
}).Error("Could not retrieve container name from the Docker client")
292+
return "", err
293+
}
294+
295+
if strings.HasPrefix(hostname, "\x01\x00\x00\x00\x00\x00\x00\r") {
296+
hostname = strings.ReplaceAll(hostname, "\x01\x00\x00\x00\x00\x00\x00\r", "")
297+
log.WithFields(log.Fields{
298+
"hostname": hostname,
299+
}).Debug("Container name has been sanitized")
300+
}
301+
302+
log.WithFields(log.Fields{
303+
"containerName": containerName,
304+
"hostname": hostname,
305+
}).Info("Hostname retrieved from the Docker client")
306+
307+
return hostname, nil
308+
}
309+
310+
func startAgent(profile string, serviceName string) error {
311+
cmd := []string{"elastic-agent", "run"}
312+
err := execCommandInService(profile, serviceName, cmd, true)
313+
if err != nil {
314+
log.WithFields(log.Fields{
315+
"command": cmd,
316+
"error": err,
317+
"service": serviceName,
318+
}).Error("Could not run the agent")
319+
320+
return err
321+
}
322+
323+
return nil
324+
}

0 commit comments

Comments
 (0)