diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json
index 9617173bd0c7b..cd9bc9633373c 100644
--- a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json
+++ b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json
@@ -3520,7 +3520,17 @@
]
}
},
- "/fleet/agents/unenroll": {
+ "/fleet/agents/{agentId}/unenroll": {
+ "parameters": [
+ {
+ "schema": {
+ "type": "string"
+ },
+ "name": "agentId",
+ "in": "path",
+ "required": true
+ }
+ ],
"post": {
"summary": "Fleet - Agent - Unenroll",
"tags": [],
@@ -3530,7 +3540,26 @@
{
"$ref": "#/components/parameters/xsrfHeader"
}
- ]
+ ],
+ "requestBody": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "force": { "type": "boolean" }
+ }
+ },
+ "examples": {
+ "example-1": {
+ "value": {
+ "force": true
+ }
+ }
+ }
+ }
+ }
+ }
}
},
"/fleet/config/{configId}/agent-status": {
diff --git a/x-pack/plugins/ingest_manager/common/services/agent_status.ts b/x-pack/plugins/ingest_manager/common/services/agent_status.ts
index cc1c2da710516..96435b67cf943 100644
--- a/x-pack/plugins/ingest_manager/common/services/agent_status.ts
+++ b/x-pack/plugins/ingest_manager/common/services/agent_status.ts
@@ -21,6 +21,9 @@ export function getAgentStatus(agent: Agent, now: number = Date.now()): AgentSta
if (!agent.active) {
return 'inactive';
}
+ if (agent.unenrollement_started_at && !agent.unenrolled_at) {
+ return 'unenrolling';
+ }
if (agent.current_error_events.length > 0) {
return 'error';
}
diff --git a/x-pack/plugins/ingest_manager/common/types/models/agent.ts b/x-pack/plugins/ingest_manager/common/types/models/agent.ts
index 63f8c5e926be0..4b29dade35dfd 100644
--- a/x-pack/plugins/ingest_manager/common/types/models/agent.ts
+++ b/x-pack/plugins/ingest_manager/common/types/models/agent.ts
@@ -11,7 +11,7 @@ export type AgentType =
| typeof AGENT_TYPE_PERMANENT
| typeof AGENT_TYPE_TEMPORARY;
-export type AgentStatus = 'offline' | 'error' | 'online' | 'inactive' | 'warning';
+export type AgentStatus = 'offline' | 'error' | 'online' | 'inactive' | 'warning' | 'unenrolling';
export type AgentActionType = 'CONFIG_CHANGE' | 'DATA_DUMP' | 'RESUME' | 'PAUSE' | 'UNENROLL';
export interface NewAgentAction {
type: AgentActionType;
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx
index 75d0556755149..6d04f63702c64 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx
@@ -236,7 +236,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => {
},
{
field: 'active',
- width: '100px',
+ width: '120px',
name: i18n.translate('xpack.ingestManager.agentList.statusColumnTitle', {
defaultMessage: 'Status',
}),
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx
index 181ebe3504222..e4dfa520259eb 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx
@@ -53,6 +53,14 @@ const Status = {
/>
),
+ Unenrolling: (
+
+
+
+ ),
};
function getStatusComponent(agent: Agent): React.ReactElement {
@@ -65,6 +73,8 @@ function getStatusComponent(agent: Agent): React.ReactElement {
return Status.Offline;
case 'warning':
return Status.Warning;
+ case 'unenrolling':
+ return Status.Unenrolling;
default:
return Status.Online;
}
diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_unenroll_provider.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_unenroll_provider.tsx
index fec2253c0dd56..90d8ff545341d 100644
--- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_unenroll_provider.tsx
+++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_unenroll_provider.tsx
@@ -74,7 +74,7 @@ export const AgentUnenrollProvider: React.FunctionComponent = ({ children
const successMessage = i18n.translate(
'xpack.ingestManager.unenrollAgents.successSingleNotificationTitle',
{
- defaultMessage: "Unenrolled agent '{id}'",
+ defaultMessage: "Unenrolling agent '{id}'",
values: { id: agentId },
}
);
diff --git a/x-pack/plugins/ingest_manager/server/routes/agent/unenroll_handler.ts b/x-pack/plugins/ingest_manager/server/routes/agent/unenroll_handler.ts
index f72e0f2372c64..d1e54fe4fb3a1 100644
--- a/x-pack/plugins/ingest_manager/server/routes/agent/unenroll_handler.ts
+++ b/x-pack/plugins/ingest_manager/server/routes/agent/unenroll_handler.ts
@@ -18,9 +18,9 @@ export const postAgentsUnenrollHandler: RequestHandler<
const soClient = context.core.savedObjects.client;
try {
if (request.body?.force === true) {
- await AgentService.unenrollAgent(soClient, request.params.agentId);
- } else {
await AgentService.forceUnenrollAgent(soClient, request.params.agentId);
+ } else {
+ await AgentService.unenrollAgent(soClient, request.params.agentId);
}
const body: PostAgentUnenrollResponse = {
diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts
index f53c4391ef2dc..a508c33e0347b 100644
--- a/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts
+++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts
@@ -70,7 +70,7 @@ export const PostAgentUnenrollRequestSchema = {
params: schema.object({
agentId: schema.string(),
}),
- body: schema.maybe(
+ body: schema.nullable(
schema.object({
force: schema.boolean(),
})