blob: 5dbefddb6ab8286536a56b11b2d861468ee7672e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.metron.indexing.dao;
import org.adrianwalker.multilinestring.Multiline;
import org.apache.metron.common.utils.JSONUtils;
import org.apache.metron.indexing.InMemoryMetaAlertRetrieveLatestDao;
import org.apache.metron.indexing.dao.metaalert.MetaAlertConfig;
import org.apache.metron.indexing.dao.metaalert.MetaAlertConstants;
import org.apache.metron.indexing.dao.metaalert.MetaAlertCreateRequest;
import org.apache.metron.indexing.dao.metaalert.MetaAlertDao;
import org.apache.metron.indexing.dao.metaalert.MetaAlertRetrieveLatestDao;
import org.apache.metron.indexing.dao.metaalert.MetaAlertStatus;
import org.apache.metron.indexing.dao.metaalert.MetaAlertUpdateDao;
import org.apache.metron.indexing.dao.search.FieldType;
import org.apache.metron.indexing.dao.search.GetRequest;
import org.apache.metron.indexing.dao.search.GroupRequest;
import org.apache.metron.indexing.dao.search.GroupResponse;
import org.apache.metron.indexing.dao.search.InvalidCreateException;
import org.apache.metron.indexing.dao.search.InvalidSearchException;
import org.apache.metron.indexing.dao.search.SearchRequest;
import org.apache.metron.indexing.dao.search.SearchResponse;
import org.apache.metron.indexing.dao.update.CommentAddRemoveRequest;
import org.apache.metron.indexing.dao.update.Document;
import org.apache.metron.indexing.dao.update.OriginalNotFoundException;
import org.apache.metron.indexing.dao.update.PatchRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
import static org.apache.metron.common.Constants.SENSOR_TYPE;
public class InMemoryMetaAlertDao implements MetaAlertDao {
public static final String METAALERT_INDEX = "metaalert_index";
private IndexDao indexDao;
private MetaAlertRetrieveLatestDao metaAlertRetrieveLatestDao;
private MetaAlertUpdateDao metaAlertUpdateDao;
private int pageSize = 10;
/**
* {
* "indices": ["metaalert"],
* "query": "metron_alert|guid:${GUID}",
* "from": 0,
* "size": 10,
* "sort": [
* {
* "field": "guid",
* "sortOrder": "desc"
* }
* ]
* }
*/
@Multiline
public static String metaAlertsForAlertQuery;
@Override
public SearchResponse search(SearchRequest searchRequest) throws InvalidSearchException {
return indexDao.search(searchRequest);
}
@Override
public GroupResponse group(GroupRequest groupRequest) throws InvalidSearchException {
return indexDao.group(groupRequest);
}
@Override
public void init(AccessConfig config) {
// Do nothing
}
@Override
public void init(IndexDao indexDao, Optional<String> threatSort) {
this.indexDao = indexDao;
this.metaAlertRetrieveLatestDao = new InMemoryMetaAlertRetrieveLatestDao(indexDao);
Supplier<Map<String, Object>> globalConfigSupplier = () -> new HashMap<>();
MetaAlertConfig config = new MetaAlertConfig(
METAALERT_INDEX,
null,
globalConfigSupplier
) {
@Override
protected String getDefaultThreatTriageField() {
return MetaAlertConstants.THREAT_FIELD_DEFAULT;
}
@Override
protected String getDefaultSourceTypeField() {
return SENSOR_TYPE;
}
};
this.metaAlertUpdateDao = new InMemoryMetaAlertUpdateDao(indexDao, metaAlertRetrieveLatestDao, config, -1);
// Ignore threatSort for test.
}
@Override
public Document getLatest(String guid, String sensorType) throws IOException {
return indexDao.getLatest(guid, sensorType);
}
@Override
public Iterable<Document> getAllLatest(List<GetRequest> getRequests) throws IOException {
return indexDao.getAllLatest(getRequests);
}
@Override
public Document update(Document update, Optional<String> index) throws IOException {
return indexDao.update(update, index);
}
@Override
public Map<Document, Optional<String>> batchUpdate(Map<Document, Optional<String>> updates) {
throw new UnsupportedOperationException("InMemoryMetaAlertDao can't do bulk updates");
}
@Override
public Map<String, FieldType> getColumnMetadata(List<String> indices)
throws IOException {
return indexDao.getColumnMetadata(indices);
}
@Override
public Document addCommentToAlert(CommentAddRemoveRequest request) {
return null;
}
@Override
public Document removeCommentFromAlert(CommentAddRemoveRequest request) {
return null;
}
@Override
public Document addCommentToAlert(CommentAddRemoveRequest request, Document latest) {
return null;
}
@Override
public Document removeCommentFromAlert(CommentAddRemoveRequest request, Document latest) {
return null;
}
@Override
public Optional<Map<String, Object>> getLatestResult(GetRequest request) throws IOException {
return indexDao.getLatestResult(request);
}
@Override
public Document patch(RetrieveLatestDao retrieveLatestDao, PatchRequest request,
Optional<Long> timestamp)
throws OriginalNotFoundException, IOException {
return indexDao.patch(retrieveLatestDao, request, timestamp);
}
@Override
public SearchResponse getAllMetaAlertsForAlert(String guid) throws InvalidSearchException {
SearchRequest request;
try {
String replacedQuery = metaAlertsForAlertQuery.replace("${GUID}", guid);
request = JSONUtils.INSTANCE.load(replacedQuery, SearchRequest.class);
} catch (IOException e) {
throw new InvalidSearchException("Unable to process query:", e);
}
return search(request);
}
@SuppressWarnings("unchecked")
@Override
public Document createMetaAlert(MetaAlertCreateRequest request)
throws InvalidCreateException, IOException {
return metaAlertUpdateDao.createMetaAlert(request);
}
@Override
public Document addAlertsToMetaAlert(String metaAlertGuid, List<GetRequest> alertRequests) throws IOException {
return metaAlertUpdateDao.addAlertsToMetaAlert(metaAlertGuid, alertRequests);
}
@Override
public Document removeAlertsFromMetaAlert(String metaAlertGuid, List<GetRequest> alertRequests) throws IOException {
return metaAlertUpdateDao.removeAlertsFromMetaAlert(metaAlertGuid, alertRequests);
}
@SuppressWarnings("unchecked")
@Override
public Document updateMetaAlertStatus(String metaAlertGuid, MetaAlertStatus status)
throws IOException {
return metaAlertUpdateDao.updateMetaAlertStatus(metaAlertGuid, status);
}
public static void clear() {
InMemoryDao.clear();
}
}