diff --git a/x-pack/plugins/ml/server/saved_objects/service.ts b/x-pack/plugins/ml/server/saved_objects/service.ts index bfc5b165fe555..207f10dc33d4b 100644 --- a/x-pack/plugins/ml/server/saved_objects/service.ts +++ b/x-pack/plugins/ml/server/saved_objects/service.ts @@ -114,6 +114,19 @@ export function jobSavedObjectServiceFactory( await savedObjectsClient.delete(ML_SAVED_OBJECT_TYPE, job.id, { force: true }); } + async function _forceDeleteJob(jobType: JobType, jobId: string, namespace: string) { + const id = savedObjectId({ + job_id: jobId, + datafeed_id: null, + type: jobType, + }); + + await internalSavedObjectsClient.delete(ML_SAVED_OBJECT_TYPE, id, { + namespace, + force: true, + }); + } + async function createAnomalyDetectionJob(jobId: string, datafeedId?: string) { await _createJob('anomaly-detector', jobId, datafeedId); } @@ -122,6 +135,10 @@ export function jobSavedObjectServiceFactory( await _deleteJob('anomaly-detector', jobId); } + async function forceDeleteAnomalyDetectionJob(jobId: string, namespace: string) { + await _forceDeleteJob('anomaly-detector', jobId, namespace); + } + async function createDataFrameAnalyticsJob(jobId: string) { await _createJob('data-frame-analytics', jobId); } @@ -130,6 +147,10 @@ export function jobSavedObjectServiceFactory( await _deleteJob('data-frame-analytics', jobId); } + async function forceDeleteDataFrameAnalyticsJob(jobId: string, namespace: string) { + await _forceDeleteJob('data-frame-analytics', jobId, namespace); + } + async function bulkCreateJobs(jobs: Array<{ job: JobObject; namespaces: string[] }>) { return await _bulkCreateJobs(jobs); } @@ -325,7 +346,9 @@ export function jobSavedObjectServiceFactory( createAnomalyDetectionJob, createDataFrameAnalyticsJob, deleteAnomalyDetectionJob, + forceDeleteAnomalyDetectionJob, deleteDataFrameAnalyticsJob, + forceDeleteDataFrameAnalyticsJob, addDatafeed, deleteDatafeed, filterJobsForSpace, diff --git a/x-pack/plugins/ml/server/saved_objects/sync.ts b/x-pack/plugins/ml/server/saved_objects/sync.ts index 16e0520567056..00dfdba178fe5 100644 --- a/x-pack/plugins/ml/server/saved_objects/sync.ts +++ b/x-pack/plugins/ml/server/saved_objects/sync.ts @@ -94,10 +94,14 @@ export function syncSavedObjectsFactory( results.savedObjectsDeleted[job.jobId] = { success: true }; } else { // Delete AD saved objects for jobs which no longer exist - const jobId = job.jobId; + const { jobId, namespaces } = job; tasks.push(async () => { try { - await jobSavedObjectService.deleteAnomalyDetectionJob(jobId); + if (namespaces !== undefined && namespaces.length) { + await jobSavedObjectService.forceDeleteAnomalyDetectionJob(jobId, namespaces[0]); + } else { + await jobSavedObjectService.deleteAnomalyDetectionJob(jobId); + } results.savedObjectsDeleted[job.jobId] = { success: true }; } catch (error) { results.savedObjectsDeleted[job.jobId] = { @@ -115,10 +119,14 @@ export function syncSavedObjectsFactory( results.savedObjectsDeleted[job.jobId] = { success: true }; } else { // Delete DFA saved objects for jobs which no longer exist - const jobId = job.jobId; + const { jobId, namespaces } = job; tasks.push(async () => { try { - await jobSavedObjectService.deleteDataFrameAnalyticsJob(jobId); + if (namespaces !== undefined && namespaces.length) { + await jobSavedObjectService.forceDeleteDataFrameAnalyticsJob(jobId, namespaces[0]); + } else { + await jobSavedObjectService.deleteDataFrameAnalyticsJob(jobId); + } results.savedObjectsDeleted[job.jobId] = { success: true }; } catch (error) { results.savedObjectsDeleted[job.jobId] = {