Skip to content

Commit 0b3cf8b

Browse files
authored
[system test] Add remove agent handler just after setting up agent (#2449)
Ensure Elastic Agent created when using Independent Agents (default method via "r.setupAgent") is removed in the tear down process even if the service exists with error.
1 parent 6c54c5f commit 0b3cf8b

File tree

1 file changed

+44
-29
lines changed

1 file changed

+44
-29
lines changed

internal/testrunner/runners/system/tester.go

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,18 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
11791179

11801180
scenario.agent = agentDeployed
11811181

1182+
if agentDeployed != nil {
1183+
// The Elastic Agent created in `r.setupAgent` needs to be retrieved just after starting it, to ensure
1184+
// it can be removed and unenrolled if the service fails to start.
1185+
// This function must also be called after setting the service (r.setupService), since there are other
1186+
// deployers like custom agents or kubernetes deployer that create new Elastic Agents too that needs to
1187+
// be retrieved too.
1188+
_, err := r.checkEnrolledAgents(ctx, agentInfo, svcInfo)
1189+
if err != nil {
1190+
return nil, fmt.Errorf("can't check enrolled agents: %w", err)
1191+
}
1192+
}
1193+
11821194
service, svcInfo, err := r.setupService(ctx, config, serviceOptions, svcInfo, agentInfo, agentDeployed, policy, serviceStateData)
11831195
if errors.Is(err, os.ErrNotExist) {
11841196
logger.Debugf("No service deployer defined for this test")
@@ -1238,33 +1250,16 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
12381250
return nil
12391251
}
12401252

1241-
// FIXME: running per stages does not work when multiple agents are created
1242-
var origPolicy kibana.Policy
12431253
// While there could be created Elastic Agents within `setupService()` (custom agents and k8s agents),
1244-
// this "checkEnrolledAgents" call to must be located after creating the service.
1245-
agents, err := checkEnrolledAgents(ctx, r.kibanaClient, agentInfo, svcInfo, r.runIndependentElasticAgent)
1254+
// this "checkEnrolledAgents" call must be duplicated here after creating the service too. This will
1255+
// ensure to get the right Enrolled Elastic Agent too.
1256+
agent, err := r.checkEnrolledAgents(ctx, agentInfo, svcInfo)
12461257
if err != nil {
12471258
return nil, fmt.Errorf("can't check enrolled agents: %w", err)
12481259
}
1249-
agent := agents[0]
1250-
logger.Debugf("Selected enrolled agent %q", agent.ID)
1251-
1252-
r.removeAgentHandler = func(ctx context.Context) error {
1253-
if r.runTestsOnly {
1254-
return nil
1255-
}
1256-
// When not using independent agents, service deployers like kubernetes or custom agents create new Elastic Agent
1257-
if !r.runIndependentElasticAgent && !svcInfo.Agent.Independent {
1258-
return nil
1259-
}
1260-
logger.Debug("removing agent...")
1261-
err := r.kibanaClient.RemoveAgent(ctx, agent)
1262-
if err != nil {
1263-
return fmt.Errorf("failed to remove agent %q: %w", agent.ID, err)
1264-
}
1265-
return nil
1266-
}
12671260

1261+
// FIXME: running per stages does not work when multiple agents are created
1262+
var origPolicy kibana.Policy
12681263
if r.runTearDown {
12691264
origPolicy = serviceStateData.OrigPolicy
12701265
logger.Debugf("Got orig policy from file: %q - %q", origPolicy.Name, origPolicy.ID)
@@ -1291,7 +1286,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
12911286
}
12921287

12931288
logger.Debug("reassigning original policy back to agent...")
1294-
if err := r.kibanaClient.AssignPolicyToAgent(ctx, agent, origPolicy); err != nil {
1289+
if err := r.kibanaClient.AssignPolicyToAgent(ctx, *agent, origPolicy); err != nil {
12951290
return fmt.Errorf("error reassigning original policy to agent: %w", err)
12961291
}
12971292
return nil
@@ -1339,7 +1334,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
13391334
}
13401335

13411336
logger.Debug("assigning package data stream to agent...")
1342-
if err := r.kibanaClient.AssignPolicyToAgent(ctx, agent, *policyWithDataStream); err != nil {
1337+
if err := r.kibanaClient.AssignPolicyToAgent(ctx, *agent, *policyWithDataStream); err != nil {
13431338
return nil, fmt.Errorf("could not assign policy to agent: %w", err)
13441339
}
13451340
}
@@ -1406,7 +1401,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC
14061401
enrollPolicy: policyToEnroll,
14071402
currentPolicy: policyToTest,
14081403
config: config,
1409-
agent: origAgent,
1404+
agent: *origAgent,
14101405
agentInfo: agentInfo,
14111406
svcInfo: svcInfo,
14121407
}
@@ -1851,16 +1846,16 @@ func dumpScenarioDocs(docs any) error {
18511846
return nil
18521847
}
18531848

1854-
func checkEnrolledAgents(ctx context.Context, client *kibana.Client, agentInfo agentdeployer.AgentInfo, svcInfo servicedeployer.ServiceInfo, runIndependentElasticAgent bool) ([]kibana.Agent, error) {
1849+
func (r *tester) checkEnrolledAgents(ctx context.Context, agentInfo agentdeployer.AgentInfo, svcInfo servicedeployer.ServiceInfo) (*kibana.Agent, error) {
18551850
var agents []kibana.Agent
18561851

18571852
enrolled, err := wait.UntilTrue(ctx, func(ctx context.Context) (bool, error) {
1858-
allAgents, err := client.ListAgents(ctx)
1853+
allAgents, err := r.kibanaClient.ListAgents(ctx)
18591854
if err != nil {
18601855
return false, fmt.Errorf("could not list agents: %w", err)
18611856
}
18621857

1863-
if runIndependentElasticAgent {
1858+
if r.runIndependentElasticAgent {
18641859
agents = filterIndependentAgents(allAgents, agentInfo)
18651860
} else {
18661861
agents = filterAgents(allAgents, svcInfo)
@@ -1877,7 +1872,27 @@ func checkEnrolledAgents(ctx context.Context, client *kibana.Client, agentInfo a
18771872
if !enrolled {
18781873
return nil, errors.New("no agent enrolled in time")
18791874
}
1880-
return agents, nil
1875+
1876+
agent := agents[0]
1877+
logger.Debugf("Selected enrolled agent %q", agent.ID)
1878+
1879+
r.removeAgentHandler = func(ctx context.Context) error {
1880+
if r.runTestsOnly {
1881+
return nil
1882+
}
1883+
// When not using independent agents, service deployers like kubernetes or custom agents create new Elastic Agent
1884+
if !r.runIndependentElasticAgent && !svcInfo.Agent.Independent {
1885+
return nil
1886+
}
1887+
logger.Debug("removing agent...")
1888+
err := r.kibanaClient.RemoveAgent(ctx, agent)
1889+
if err != nil {
1890+
return fmt.Errorf("failed to remove agent %q: %w", agent.ID, err)
1891+
}
1892+
return nil
1893+
}
1894+
1895+
return &agent, nil
18811896
}
18821897

18831898
func createPackageDatastream(

0 commit comments

Comments
 (0)