You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metron.apache.org by ni...@apache.org on 2018/08/31 19:20:09 UTC
[13/50] [abbrv] metron git commit: METRON-1700 Create REST endpoint
to get job configuration (merrimanr) closes apache/metron#1135
METRON-1700 Create REST endpoint to get job configuration (merrimanr) closes apache/metron#1135
Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/2b6959b4
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/2b6959b4
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/2b6959b4
Branch: refs/remotes/apache/feature/METRON-1699-create-batch-profiler
Commit: 2b6959b46db79256d12b8522385212559cabada2
Parents: d5eb56a
Author: merrimanr <me...@gmail.com>
Authored: Thu Aug 2 12:17:37 2018 -0500
Committer: rmerriman <me...@gmail.com>
Committed: Thu Aug 2 12:17:37 2018 -0500
----------------------------------------------------------------------
metron-interface/metron-rest/README.md | 10 ++
.../metron/rest/controller/PcapController.java | 16 +++
.../apache/metron/rest/service/PcapService.java | 71 ++++++++++++-
.../rest/service/impl/PcapServiceImpl.java | 54 +++++++++-
.../PcapControllerIntegrationTest.java | 50 ++++++++++
.../apache/metron/rest/mock/MockPcapJob.java | 4 +-
.../rest/service/impl/PcapServiceImplTest.java | 100 +++++++++++++++++++
.../java/org/apache/metron/job/Statusable.java | 2 +
.../java/org/apache/metron/pcap/mr/PcapJob.java | 5 +
9 files changed, 306 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/README.md
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/README.md b/metron-interface/metron-rest/README.md
index 68ec559..489cd9f 100644
--- a/metron-interface/metron-rest/README.md
+++ b/metron-interface/metron-rest/README.md
@@ -259,6 +259,8 @@ Request and Response objects are JSON formatted. The JSON schemas are available
| [ `GET /api/v1/pcap/{jobId}`](#get-apiv1pcapjobid)|
| [ `GET /api/v1/pcap/{jobId}/pdml`](#get-apiv1pcapjobidpdml)|
| [ `GET /api/v1/pcap/{jobId}/raw`](#get-apiv1pcapjobidraw)|
+| [ `DELETE /api/v1/pcap/kill/{jobId}`](#delete-apiv1pcapkilljobid)|
+| [ `GET /api/v1/pcap/{jobId}/config`](#get-apiv1pcapjobidconfig)|
| [ `GET /api/v1/search/search`](#get-apiv1searchsearch)|
| [ `POST /api/v1/search/search`](#post-apiv1searchsearch)|
| [ `POST /api/v1/search/group`](#post-apiv1searchgroup)|
@@ -556,6 +558,14 @@ Request and Response objects are JSON formatted. The JSON schemas are available
* jobId - Job ID of submitted job
* Returns:
* 200 - Kills passed job.
+
+### `GET /api/v1/pcap/{jobId}/config`
+ * Description: Gets job configuration for Pcap query job.
+ * Input:
+ * jobId - Job ID of submitted job
+ * Returns:
+ * 200 - Returns a map of job properties for the Job ID.
+ * 404 - Job is missing.
### `POST /api/v1/search/search`
* Description: Searches the indexing store. GUIDs must be quoted to ensure correct results.
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/controller/PcapController.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/controller/PcapController.java b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/controller/PcapController.java
index 13a623a..97713d8 100644
--- a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/controller/PcapController.java
+++ b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/controller/PcapController.java
@@ -46,6 +46,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
+import java.util.Map;
@RestController
@RequestMapping("/api/v1/pcap")
@@ -161,4 +162,19 @@ public class PcapController {
}
}
+ @ApiOperation(value = "Gets job configuration for Pcap query job.")
+ @ApiResponses(value = {
+ @ApiResponse(message = "Returns a map of job properties for the Job ID.", code = 200),
+ @ApiResponse(message = "Job is missing.", code = 404)
+ })
+ @RequestMapping(value = "/{jobId}/config", method = RequestMethod.GET)
+ ResponseEntity<Map<String, Object>> getConfiguration(@ApiParam(name="jobId", value="Job ID of submitted job", required=true)@PathVariable String jobId) throws RestException {
+ Map<String, Object> configuration = pcapQueryService.getConfiguration(SecurityUtils.getCurrentUser(), jobId);
+ if (configuration != null) {
+ return new ResponseEntity<>(configuration, HttpStatus.OK);
+ } else {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/PcapService.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/PcapService.java b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/PcapService.java
index 00efab9..5ec937f 100644
--- a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/PcapService.java
+++ b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/PcapService.java
@@ -26,22 +26,91 @@ import org.apache.metron.rest.model.pcap.Pdml;
import java.io.InputStream;
import java.util.List;
+import java.util.Map;
public interface PcapService {
+ /**
+ * Submits a pcap query. Jobs that do not match any pcap data will return a status without a job id and a
+ * description of why data did not match.
+ *
+ * @param username User that is submitting the job
+ * @param pcapRequest Either a fixed or query filter pcap request
+ * @return Status of the submitted job
+ * @throws RestException
+ */
PcapStatus submit(String username, PcapRequest pcapRequest) throws RestException;
+ /**
+ * Returns the status of a job given a job id and user who submitted it.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id of a submitted job
+ * @return Status of the submitted job or null if job does not exist
+ * @throws RestException
+ */
PcapStatus getJobStatus(String username, String jobId) throws RestException;
+ /**
+ * Returns a list of statuses for jobs a user has submitted that match the given job state.
+ *
+ * @param username User that submitted the job
+ * @param state Job state
+ * @return List of job statuses of an empty list of no jobs match
+ * @throws RestException
+ */
List<PcapStatus> getJobStatus(String username, JobStatus.State state) throws RestException;
+ /**
+ * Kills a running job.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id of a submitted job
+ * @return Status of the killed job
+ * @throws RestException
+ */
PcapStatus killJob(String username, String jobId) throws RestException;
+ /**
+ * Gets an HDFS path to results of a pcap query given a user, job id and page number.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id
+ * @param page Page number
+ * @return HDFS path to results
+ * @throws RestException
+ */
Path getPath(String username, String jobId, Integer page) throws RestException;
+ /**
+ * Gets pcap query results in <a href="https://wiki.wireshark.org/PDML">PDML</a> format for a given user, job id and page number.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id
+ * @param page Page number
+ * @return Results in PDML format
+ * @throws RestException
+ */
Pdml getPdml(String username, String jobId, Integer page) throws RestException;
+ /**
+ * Returns an input stream of raw binary pcap results for a given user, job id and page number.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id
+ * @param page Page number
+ * @return Input stream of raw pcap results
+ * @throws RestException
+ */
InputStream getRawPcap(String username, String jobId, Integer page) throws RestException;
-
+ /**
+ * Gets the configuration of a submitted pcap query. Internal properties such as file system, hadoop config, etc are not included.
+ *
+ * @param username User that submitted the job
+ * @param jobId Job id
+ * @return Configuration of a submitted pcap query
+ * @throws RestException
+ */
+ Map<String, Object> getConfiguration(String username, String jobId) throws RestException;
}
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/impl/PcapServiceImpl.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/impl/PcapServiceImpl.java b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/impl/PcapServiceImpl.java
index ff80c8f..f3af0dd 100644
--- a/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/impl/PcapServiceImpl.java
+++ b/metron-interface/metron-rest/src/main/java/org/apache/metron/rest/service/impl/PcapServiceImpl.java
@@ -28,26 +28,40 @@ import org.apache.metron.job.Pageable;
import org.apache.metron.job.Statusable;
import org.apache.metron.job.manager.JobManager;
import org.apache.metron.pcap.config.PcapOptions;
+import org.apache.metron.pcap.filter.PcapFilterConfigurator;
+import org.apache.metron.pcap.filter.fixed.FixedPcapFilter;
+import org.apache.metron.pcap.filter.query.QueryPcapFilter;
import org.apache.metron.rest.MetronRestConstants;
import org.apache.metron.rest.RestException;
import org.apache.metron.rest.config.PcapJobSupplier;
+import org.apache.metron.rest.model.pcap.FixedPcapOptions;
import org.apache.metron.rest.model.pcap.PcapRequest;
import org.apache.metron.rest.model.pcap.PcapStatus;
import org.apache.metron.rest.model.pcap.Pdml;
+import org.apache.metron.rest.model.pcap.QueryPcapOptions;
import org.apache.metron.rest.service.PcapService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
@Service
public class PcapServiceImpl implements PcapService {
+ private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
private Environment environment;
private Configuration configuration;
private PcapJobSupplier pcapJobSupplier;
@@ -93,7 +107,7 @@ public class PcapServiceImpl implements PcapService {
pcapStatus = statusableToPcapStatus(statusable);
}
} catch (JobNotFoundException | InterruptedException e) {
- // do nothing and return null pcapStatus
+ LOG.warn(String.format("Could not get job status. Job not found for user %s with job id %s", username, jobId));
} catch (JobException e) {
throw new RestException(e);
}
@@ -139,7 +153,7 @@ public class PcapServiceImpl implements PcapService {
try {
jobManager.killJob(username, jobId);
} catch (JobNotFoundException e) {
- // do nothing and return null pcapStatus
+ LOG.warn(String.format("Could not kill job. Job not found for user %s with job id %s", username, jobId));
return null;
} catch (JobException e) {
throw new RestException(e);
@@ -159,7 +173,7 @@ public class PcapServiceImpl implements PcapService {
}
}
} catch (JobNotFoundException e) {
- // do nothing and return null pcapStatus
+ LOG.warn(String.format("Could not get path for page %s. Job not found for user %s with job id %s", page, username, jobId));
} catch (JobException | InterruptedException e) {
throw new RestException(e);
}
@@ -199,6 +213,40 @@ public class PcapServiceImpl implements PcapService {
return inputStream;
}
+ @Override
+ public Map<String, Object> getConfiguration(String username, String jobId) throws RestException {
+ Map<String, Object> configuration = new HashMap<>();
+ try {
+ Statusable<Path> statusable = jobManager.getJob(username, jobId);
+ if (statusable != null) {
+ Map<String, Object> jobConfiguration = statusable.getConfiguration();
+ configuration.put(PcapOptions.BASE_PATH.getKey(), PcapOptions.BASE_PATH.get(jobConfiguration, String.class));
+ configuration.put(PcapOptions.FINAL_OUTPUT_PATH.getKey(), PcapOptions.FINAL_OUTPUT_PATH.get(jobConfiguration, String.class));
+ configuration.put(PcapOptions.START_TIME_MS.getKey(), PcapOptions.START_TIME_MS.get(jobConfiguration, String.class));
+ configuration.put(PcapOptions.END_TIME_MS.getKey(), PcapOptions.END_TIME_MS.get(jobConfiguration, String.class));
+ configuration.put(PcapOptions.NUM_REDUCERS.getKey(), PcapOptions.NUM_REDUCERS.get(jobConfiguration, Integer.class));
+
+ boolean isFixedFilter = PcapOptions.FILTER_IMPL.get(jobConfiguration, PcapFilterConfigurator.class) instanceof FixedPcapFilter.Configurator;
+ if (isFixedFilter) {
+ configuration.put(FixedPcapOptions.IP_SRC_ADDR.getKey(), FixedPcapOptions.IP_SRC_ADDR.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.IP_DST_ADDR.getKey(), FixedPcapOptions.IP_DST_ADDR.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.IP_SRC_PORT.getKey(), FixedPcapOptions.IP_SRC_PORT.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.IP_DST_PORT.getKey(), FixedPcapOptions.IP_DST_PORT.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.PROTOCOL.getKey(), FixedPcapOptions.PROTOCOL.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.PACKET_FILTER.getKey(), FixedPcapOptions.PACKET_FILTER.get(jobConfiguration, String.class));
+ configuration.put(FixedPcapOptions.INCLUDE_REVERSE.getKey(), FixedPcapOptions.INCLUDE_REVERSE.get(jobConfiguration, String.class));
+ } else {
+ configuration.put(QueryPcapOptions.QUERY.getKey(), QueryPcapOptions.QUERY.get(jobConfiguration, String.class));
+ }
+ }
+ } catch (JobNotFoundException e) {
+ LOG.warn(String.format("Could not get job configuration. Job not found for user %s with job id %s", username, jobId));
+ } catch (JobException e) {
+ throw new RestException(e);
+ }
+ return configuration;
+ }
+
protected void setPcapOptions(String username, PcapRequest pcapRequest) throws IOException {
PcapOptions.JOB_NAME.put(pcapRequest, "jobName");
PcapOptions.USERNAME.put(pcapRequest, username);
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/controller/PcapControllerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/controller/PcapControllerIntegrationTest.java b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/controller/PcapControllerIntegrationTest.java
index 5d30e72..2d7c505 100644
--- a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/controller/PcapControllerIntegrationTest.java
+++ b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/controller/PcapControllerIntegrationTest.java
@@ -420,5 +420,55 @@ public class PcapControllerIntegrationTest {
.andExpect(status().isNotFound());
}
+ @Test
+ public void testGetFixedFilterConfiguration() throws Exception {
+ MockPcapJob mockPcapJob = (MockPcapJob) wac.getBean("mockPcapJob");
+
+ mockPcapJob.setStatus(new JobStatus().withJobId("jobId").withState(JobStatus.State.RUNNING));
+
+ this.mockMvc.perform(post(pcapUrl + "/fixed").with(httpBasic(user, password)).with(csrf()).contentType(MediaType.parseMediaType("application/json;charset=UTF-8")).content(fixedJson))
+ .andExpect(status().isOk())
+ .andExpect(content().contentType(MediaType.parseMediaType("application/json;charset=UTF-8")))
+ .andExpect(jsonPath("$.jobId").value("jobId"))
+ .andExpect(jsonPath("$.jobStatus").value("RUNNING"));
+
+ this.mockMvc.perform(get(pcapUrl + "/jobId/config").with(httpBasic(user, password)))
+ .andExpect(status().isOk())
+ .andExpect(content().contentType(MediaType.parseMediaType("application/json;charset=UTF-8")))
+ .andExpect(jsonPath("$.basePath").value("/base/path"))
+ .andExpect(jsonPath("$.finalOutputPath").value("/final/output/path"))
+ .andExpect(jsonPath("$.startTimeMs").value(10))
+ .andExpect(jsonPath("$.endTimeMs").value(20))
+ .andExpect(jsonPath("$.numReducers").value(2))
+ .andExpect(jsonPath("$.ipSrcAddr").value("192.168.1.2"))
+ .andExpect(jsonPath("$.ipDstAddr").value("192.168.1.1"))
+ .andExpect(jsonPath("$.ipSrcPort").value("2000"))
+ .andExpect(jsonPath("$.ipDstPort").value("1000"))
+ .andExpect(jsonPath("$.protocol").value("TCP"))
+ .andExpect(jsonPath("$.packetFilter").value("filter"))
+ .andExpect(jsonPath("$.includeReverse").value("true"));
+ }
+ @Test
+ public void testGetQueryFilterConfiguration() throws Exception {
+ MockPcapJob mockPcapJob = (MockPcapJob) wac.getBean("mockPcapJob");
+
+ mockPcapJob.setStatus(new JobStatus().withJobId("jobId").withState(JobStatus.State.RUNNING));
+
+ this.mockMvc.perform(post(pcapUrl + "/query").with(httpBasic(user, password)).with(csrf()).contentType(MediaType.parseMediaType("application/json;charset=UTF-8")).content(queryJson))
+ .andExpect(status().isOk())
+ .andExpect(content().contentType(MediaType.parseMediaType("application/json;charset=UTF-8")))
+ .andExpect(jsonPath("$.jobId").value("jobId"))
+ .andExpect(jsonPath("$.jobStatus").value("RUNNING"));
+
+ this.mockMvc.perform(get(pcapUrl + "/jobId/config").with(httpBasic(user, password)))
+ .andExpect(status().isOk())
+ .andExpect(content().contentType(MediaType.parseMediaType("application/json;charset=UTF-8")))
+ .andExpect(jsonPath("$.basePath").value("/base/path"))
+ .andExpect(jsonPath("$.finalOutputPath").value("/final/output/path"))
+ .andExpect(jsonPath("$.startTimeMs").value(10))
+ .andExpect(jsonPath("$.endTimeMs").value(20))
+ .andExpect(jsonPath("$.numReducers").value(2))
+ .andExpect(jsonPath("$.query").value("query"));
+ }
}
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/mock/MockPcapJob.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/mock/MockPcapJob.java b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/mock/MockPcapJob.java
index 6a954e8..779589d 100644
--- a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/mock/MockPcapJob.java
+++ b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/mock/MockPcapJob.java
@@ -18,7 +18,6 @@
package org.apache.metron.rest.mock;
import org.apache.hadoop.fs.Path;
-import org.apache.metron.common.hadoop.SequenceFileIterable;
import org.apache.metron.job.Finalizer;
import org.apache.metron.job.JobException;
import org.apache.metron.job.JobStatus;
@@ -28,7 +27,7 @@ import org.apache.metron.pcap.config.PcapOptions;
import org.apache.metron.pcap.filter.PcapFilterConfigurator;
import org.apache.metron.pcap.mr.PcapJob;
-import java.util.List;
+import java.util.HashMap;
import java.util.Map;
import static org.mockito.Mockito.mock;
@@ -54,6 +53,7 @@ public class MockPcapJob extends PcapJob<Path> {
@Override
public Statusable<Path> submit(Finalizer<Path> finalizer, Map<String, Object> configuration) throws JobException {
+ when(statusable.getConfiguration()).thenReturn(new HashMap<>(configuration));
this.basePath = PcapOptions.BASE_PATH.get(configuration, String.class);
this.baseInterrimResultPath = PcapOptions.BASE_INTERIM_RESULT_PATH.get(configuration, String.class);
this.finalOutputPath = PcapOptions.FINAL_OUTPUT_PATH.get(configuration, String.class);
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/service/impl/PcapServiceImplTest.java
----------------------------------------------------------------------
diff --git a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/service/impl/PcapServiceImplTest.java b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/service/impl/PcapServiceImplTest.java
index f99ab93..2552df7 100644
--- a/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/service/impl/PcapServiceImplTest.java
+++ b/metron-interface/metron-rest/src/test/java/org/apache/metron/rest/service/impl/PcapServiceImplTest.java
@@ -32,6 +32,7 @@ import org.apache.metron.job.Statusable;
import org.apache.metron.job.manager.InMemoryJobManager;
import org.apache.metron.job.manager.JobManager;
import org.apache.metron.pcap.PcapHelper;
+import org.apache.metron.pcap.config.PcapOptions;
import org.apache.metron.pcap.filter.fixed.FixedPcapFilter;
import org.apache.metron.pcap.filter.query.QueryPcapFilter;
import org.apache.metron.rest.MetronRestConstants;
@@ -39,7 +40,9 @@ import org.apache.metron.rest.RestException;
import org.apache.metron.rest.config.PcapJobSupplier;
import org.apache.metron.rest.mock.MockPcapJob;
import org.apache.metron.rest.mock.MockPcapJobSupplier;
+import org.apache.metron.rest.model.pcap.FixedPcapOptions;
import org.apache.metron.rest.model.pcap.FixedPcapRequest;
+import org.apache.metron.rest.model.pcap.QueryPcapOptions;
import org.apache.metron.rest.model.pcap.QueryPcapRequest;
import org.apache.metron.rest.model.pcap.PcapStatus;
import org.apache.metron.rest.model.pcap.Pdml;
@@ -639,4 +642,101 @@ public class PcapServiceImplTest {
pcapService.getRawPcap("user", "jobId", 1);
}
+ @Test
+ public void getConfigurationShouldProperlyReturnFixedFilterConfiguration() throws Exception {
+ FixedPcapRequest fixedPcapRequest = new FixedPcapRequest();
+ fixedPcapRequest.setBasePath("basePath");
+ fixedPcapRequest.setBaseInterimResultPath("baseOutputPath");
+ fixedPcapRequest.setFinalOutputPath("finalOutputPath");
+ fixedPcapRequest.setStartTimeMs(1L);
+ fixedPcapRequest.setEndTimeMs(2L);
+ fixedPcapRequest.setNumReducers(2);
+ fixedPcapRequest.setIpSrcAddr("ip_src_addr");
+ fixedPcapRequest.setIpDstAddr("ip_dst_addr");
+ fixedPcapRequest.setIpSrcPort(1000);
+ fixedPcapRequest.setIpDstPort(2000);
+ fixedPcapRequest.setProtocol("tcp");
+ fixedPcapRequest.setPacketFilter("filter");
+ fixedPcapRequest.setIncludeReverse(true);
+ MockPcapJob mockPcapJob = new MockPcapJob();
+ mockPcapJobSupplier.setMockPcapJob(mockPcapJob);
+ JobManager jobManager = new InMemoryJobManager<>();
+
+ PcapServiceImpl pcapService = spy(new PcapServiceImpl(environment, configuration, mockPcapJobSupplier, jobManager, pcapToPdmlScriptWrapper));
+ FileSystem fileSystem = mock(FileSystem.class);
+ doReturn(fileSystem).when(pcapService).getFileSystem();
+ mockPcapJob.setStatus(new JobStatus()
+ .withJobId("jobId"));
+
+ pcapService.submit("user", fixedPcapRequest);
+
+ Map<String, Object> configuration = pcapService.getConfiguration("user", "jobId");
+ Assert.assertEquals("basePath", PcapOptions.BASE_PATH.get(configuration, String.class));
+ Assert.assertEquals("finalOutputPath", PcapOptions.FINAL_OUTPUT_PATH.get(configuration, String.class));
+ Assert.assertEquals(1L, PcapOptions.START_TIME_MS.get(configuration, Long.class).longValue());
+ Assert.assertEquals(2L, PcapOptions.END_TIME_MS.get(configuration, Long.class).longValue());
+ Assert.assertEquals(2, PcapOptions.NUM_REDUCERS.get(configuration, Integer.class).intValue());
+ Assert.assertEquals("ip_src_addr", FixedPcapOptions.IP_SRC_ADDR.get(configuration, String.class));
+ Assert.assertEquals("ip_dst_addr", FixedPcapOptions.IP_DST_ADDR.get(configuration, String.class));
+ Assert.assertEquals(1000, FixedPcapOptions.IP_SRC_PORT.get(configuration, Integer.class).intValue());
+ Assert.assertEquals(2000, FixedPcapOptions.IP_DST_PORT.get(configuration, Integer.class).intValue());
+ Assert.assertEquals("tcp", FixedPcapOptions.PROTOCOL.get(configuration, String.class));
+ Assert.assertEquals("filter", FixedPcapOptions.PACKET_FILTER.get(configuration, String.class));
+ Assert.assertEquals(true, FixedPcapOptions.INCLUDE_REVERSE.get(configuration, Boolean.class));
+ }
+
+ @Test
+ public void getConfigurationShouldProperlyReturnQueryFilterConfiguration() throws Exception {
+ QueryPcapRequest queryPcapRequest = new QueryPcapRequest();
+ queryPcapRequest.setBasePath("basePath");
+ queryPcapRequest.setBaseInterimResultPath("baseOutputPath");
+ queryPcapRequest.setFinalOutputPath("finalOutputPath");
+ queryPcapRequest.setStartTimeMs(1L);
+ queryPcapRequest.setEndTimeMs(2L);
+ queryPcapRequest.setNumReducers(2);
+ queryPcapRequest.setQuery("query");
+ MockPcapJob mockPcapJob = new MockPcapJob();
+ mockPcapJobSupplier.setMockPcapJob(mockPcapJob);
+ JobManager jobManager = new InMemoryJobManager<>();
+
+ PcapServiceImpl pcapService = spy(new PcapServiceImpl(environment, configuration, mockPcapJobSupplier, jobManager, pcapToPdmlScriptWrapper));
+ FileSystem fileSystem = mock(FileSystem.class);
+ doReturn(fileSystem).when(pcapService).getFileSystem();
+ mockPcapJob.setStatus(new JobStatus()
+ .withJobId("jobId"));
+
+ pcapService.submit("user", queryPcapRequest);
+
+ Map<String, Object> configuration = pcapService.getConfiguration("user", "jobId");
+ Assert.assertEquals("basePath", PcapOptions.BASE_PATH.get(configuration, String.class));
+ Assert.assertEquals("finalOutputPath", PcapOptions.FINAL_OUTPUT_PATH.get(configuration, String.class));
+ Assert.assertEquals(1L, PcapOptions.START_TIME_MS.get(configuration, Long.class).longValue());
+ Assert.assertEquals(2L, PcapOptions.END_TIME_MS.get(configuration, Long.class).longValue());
+ Assert.assertEquals(2, PcapOptions.NUM_REDUCERS.get(configuration, Integer.class).intValue());
+ Assert.assertEquals("query", QueryPcapOptions.QUERY.get(configuration, String.class));
+ }
+
+ @Test
+ public void getConfigurationShouldReturnEmptyMapOnMissingJob() throws Exception {
+ MockPcapJob mockPcapJob = mock(MockPcapJob.class);
+ JobManager jobManager = mock(JobManager.class);
+ doThrow(new JobNotFoundException("Not found test exception.")).when(jobManager).getJob("user", "jobId");
+
+ PcapServiceImpl pcapService = new PcapServiceImpl(environment, configuration, mockPcapJobSupplier, jobManager, pcapToPdmlScriptWrapper);
+ Map<String, Object> configuration = pcapService.getConfiguration("user", "jobId");
+ Assert.assertEquals(new HashMap<>(), configuration);
+ }
+
+ @Test
+ public void getConfigurationShouldThrowRestException() throws Exception {
+ exception.expect(RestException.class);
+ exception.expectMessage("some job exception");
+
+ JobManager jobManager = mock(JobManager.class);
+ when(jobManager.getJob("user", "jobId")).thenThrow(new JobException("some job exception"));
+
+ PcapServiceImpl pcapService = new PcapServiceImpl(environment, configuration, new PcapJobSupplier(), jobManager, pcapToPdmlScriptWrapper);
+ pcapService.getConfiguration("user", "jobId");
+ }
+
}
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-platform/metron-job/src/main/java/org/apache/metron/job/Statusable.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-job/src/main/java/org/apache/metron/job/Statusable.java b/metron-platform/metron-job/src/main/java/org/apache/metron/job/Statusable.java
index 9bdea35..8634b33 100644
--- a/metron-platform/metron-job/src/main/java/org/apache/metron/job/Statusable.java
+++ b/metron-platform/metron-job/src/main/java/org/apache/metron/job/Statusable.java
@@ -77,4 +77,6 @@ public interface Statusable<PAGE_T> {
*/
boolean validate(Map<String, Object> configuration);
+ Map<String, Object> getConfiguration();
+
}
http://git-wip-us.apache.org/repos/asf/metron/blob/2b6959b4/metron-platform/metron-pcap/src/main/java/org/apache/metron/pcap/mr/PcapJob.java
----------------------------------------------------------------------
diff --git a/metron-platform/metron-pcap/src/main/java/org/apache/metron/pcap/mr/PcapJob.java b/metron-platform/metron-pcap/src/main/java/org/apache/metron/pcap/mr/PcapJob.java
index a26e5ff..ea2aa29 100644
--- a/metron-platform/metron-pcap/src/main/java/org/apache/metron/pcap/mr/PcapJob.java
+++ b/metron-platform/metron-pcap/src/main/java/org/apache/metron/pcap/mr/PcapJob.java
@@ -28,6 +28,7 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -499,4 +500,8 @@ public class PcapJob<T> implements Statusable<Path> {
return true;
}
+ @Override
+ public Map<String, Object> getConfiguration() {
+ return new HashMap<>(this.configuration);
+ }
}