|  | @@ -20,6 +20,7 @@ import org.elasticsearch.xpack.core.ml.integration.MlRestTestStateCleaner;
 | 
	
		
			
				|  |  |  import org.elasticsearch.xpack.core.ml.job.config.Job;
 | 
	
		
			
				|  |  |  import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
 | 
	
		
			
				|  |  |  import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndexFields;
 | 
	
		
			
				|  |  | +import org.elasticsearch.xpack.core.ml.job.process.autodetect.state.TimingStats;
 | 
	
		
			
				|  |  |  import org.elasticsearch.xpack.ml.MachineLearning;
 | 
	
		
			
				|  |  |  import org.junit.After;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -35,6 +36,7 @@ import java.util.regex.Pattern;
 | 
	
		
			
				|  |  |  import static org.elasticsearch.xpack.core.security.authc.support.UsernamePasswordToken.basicAuthHeaderValue;
 | 
	
		
			
				|  |  |  import static org.hamcrest.Matchers.containsString;
 | 
	
		
			
				|  |  |  import static org.hamcrest.Matchers.equalTo;
 | 
	
		
			
				|  |  | +import static org.hamcrest.Matchers.hasEntry;
 | 
	
		
			
				|  |  |  import static org.hamcrest.Matchers.not;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  public class MlJobIT extends ESRestTestCase {
 | 
	
	
		
			
				|  | @@ -413,6 +415,55 @@ public class MlJobIT extends ESRestTestCase {
 | 
	
		
			
				|  |  |                  client().performRequest(new Request("GET", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_stats")));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testDeleteJob_TimingStatsDocumentIsDeleted() throws Exception {
 | 
	
		
			
				|  |  | +        String jobId = "delete-job-with-timing-stats-document-job";
 | 
	
		
			
				|  |  | +        String indexName = AnomalyDetectorsIndexFields.RESULTS_INDEX_PREFIX + AnomalyDetectorsIndexFields.RESULTS_INDEX_DEFAULT;
 | 
	
		
			
				|  |  | +        createFarequoteJob(jobId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertThat(
 | 
	
		
			
				|  |  | +            EntityUtils.toString(client().performRequest(new Request("GET", indexName + "/_count")).getEntity()),
 | 
	
		
			
				|  |  | +            containsString("\"count\":0"));  // documents related to the job do not exist yet
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Response openResponse =
 | 
	
		
			
				|  |  | +            client().performRequest(new Request("POST", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_open"));
 | 
	
		
			
				|  |  | +        assertThat(entityAsMap(openResponse), hasEntry("opened", true));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Request postDataRequest = new Request("POST", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_data");
 | 
	
		
			
				|  |  | +        postDataRequest.setJsonEntity("{ \"airline\":\"LOT\", \"response_time\":100, \"time\":\"2019-07-01 00:00:00Z\" }");
 | 
	
		
			
				|  |  | +        client().performRequest(postDataRequest);
 | 
	
		
			
				|  |  | +        postDataRequest.setJsonEntity("{ \"airline\":\"LOT\", \"response_time\":100, \"time\":\"2019-07-01 02:00:00Z\" }");
 | 
	
		
			
				|  |  | +        client().performRequest(postDataRequest);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Response flushResponse =
 | 
	
		
			
				|  |  | +            client().performRequest(new Request("POST", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_flush"));
 | 
	
		
			
				|  |  | +        assertThat(entityAsMap(flushResponse), hasEntry("flushed", true));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Response closeResponse =
 | 
	
		
			
				|  |  | +            client().performRequest(new Request("POST", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_close"));
 | 
	
		
			
				|  |  | +        assertThat(entityAsMap(closeResponse), hasEntry("closed", true));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String timingStatsDoc =
 | 
	
		
			
				|  |  | +            EntityUtils.toString(
 | 
	
		
			
				|  |  | +                client().performRequest(new Request("GET", indexName + "/_doc/" + TimingStats.documentId(jobId))).getEntity());
 | 
	
		
			
				|  |  | +        assertThat(timingStatsDoc, containsString("\"bucket_count\":2"));  // TimingStats doc exists, 2 buckets have been processed
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        client().performRequest(new Request("DELETE", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        waitUntilIndexIsEmpty(indexName);  // when job is being deleted, it also deletes all related documents from the shared index
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // check that the TimingStats documents got deleted
 | 
	
		
			
				|  |  | +        ResponseException exception = expectThrows(
 | 
	
		
			
				|  |  | +            ResponseException.class,
 | 
	
		
			
				|  |  | +            () -> client().performRequest(new Request("GET", indexName + "/_doc/" + TimingStats.documentId(jobId))));
 | 
	
		
			
				|  |  | +        assertThat(exception.getResponse().getStatusLine().getStatusCode(), equalTo(404));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // check that the job itself is gone
 | 
	
		
			
				|  |  | +        exception = expectThrows(
 | 
	
		
			
				|  |  | +            ResponseException.class,
 | 
	
		
			
				|  |  | +            () -> client().performRequest(new Request("GET", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId + "/_stats")));
 | 
	
		
			
				|  |  | +        assertThat(exception.getResponse().getStatusLine().getStatusCode(), equalTo(404));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public void testDeleteJobAsync() throws Exception {
 | 
	
		
			
				|  |  |          String jobId = "delete-job-async-job";
 | 
	
		
			
				|  |  |          String indexName = AnomalyDetectorsIndexFields.RESULTS_INDEX_PREFIX + AnomalyDetectorsIndexFields.RESULTS_INDEX_DEFAULT;
 |