http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrServiceLogPropsConfig.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrServiceLogPropsConfig.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrServiceLogPropsConfig.java new file mode 100644 index 0000000..482438a --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrServiceLogPropsConfig.java @@ -0,0 +1,91 @@ +/* + * 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.ambari.logsearch.conf; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SolrServiceLogPropsConfig extends SolrConnectionPropsConfig { + + @Value("${logsearch.solr.collection.service.logs:hadoop_logs}") + private String collection; + + @Value("${logsearch.service.logs.split.interval.mins:none}") + private String splitInterval; + + @Value("${logsearch.solr.service.logs.config.name:hadoop_logs}") + private String configName; + + @Value("${logsearch.collection.service.logs.numshards:1}") + private Integer numberOfShards; + + @Value("${logsearch.collection.service.logs.replication.factor:1}") + private Integer replicationFactor; + + @Override + public String getCollection() { + return collection; + } + + @Override + public void setCollection(String collection) { + this.collection = collection; + } + + @Override + public String getSplitInterval() { + return splitInterval; + } + + @Override + public void setSplitInterval(String splitInterval) { + this.splitInterval = splitInterval; + } + + @Override + public String getConfigName() { + return configName; + } + + @Override + public void setConfigName(String configName) { + this.configName = configName; + } + + @Override + public Integer getNumberOfShards() { + return numberOfShards; + } + + @Override + public void setNumberOfShards(Integer numberOfShards) { + this.numberOfShards = numberOfShards; + } + + @Override + public Integer getReplicationFactor() { + return replicationFactor; + } + + @Override + public void setReplicationFactor(Integer replicationFactor) { + this.replicationFactor = replicationFactor; + } +}
http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrUserPropsConfig.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrUserPropsConfig.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrUserPropsConfig.java new file mode 100644 index 0000000..c8c96c8 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SolrUserPropsConfig.java @@ -0,0 +1,116 @@ +/* + * 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.ambari.logsearch.conf; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class SolrUserPropsConfig extends SolrConnectionPropsConfig { + + @Value("${logsearch.solr.collection.history:history}") + private String collection; + + @Value("${logsearch.history.split.interval.mins:none}") + private String splitInterval; + + @Value("${logsearch.solr.history.config.name:history}") + private String configName; + + @Value("${logsearch.collection.history.numshards:1}") + private Integer numberOfShards; + + @Value("${logsearch.collection.history.replication.factor:2}") + private Integer replicationFactor; + + @Value("#{'${logsearch.logfeeder.include.default.level:FATAL,ERROR,WARN,INFO,DEBUG,TRACE,UNKNOWN}'.split(',')}") + private List<String> logLevels; + + @Value("${logsearch.schema.fields.populate.interval.mins:1}") + private Integer populateIntervalMins; + + @Override + public String getCollection() { + return collection; + } + + @Override + public void setCollection(String collection) { + this.collection = collection; + } + + @Override + public String getSplitInterval() { + return splitInterval; + } + + @Override + public void setSplitInterval(String splitInterval) { + this.splitInterval = splitInterval; + } + + @Override + public String getConfigName() { + return configName; + } + + @Override + public void setConfigName(String configName) { + this.configName = configName; + } + + @Override + public Integer getNumberOfShards() { + return numberOfShards; + } + + @Override + public void setNumberOfShards(Integer numberOfShards) { + this.numberOfShards = numberOfShards; + } + + @Override + public Integer getReplicationFactor() { + return replicationFactor; + } + + @Override + public void setReplicationFactor(Integer replicationFactor) { + this.replicationFactor = replicationFactor; + } + + public List<String> getLogLevels() { + return logLevels; + } + + public void setLogLevels(List<String> logLevels) { + this.logLevels = logLevels; + } + + + public Integer getPopulateIntervalMins() { + return populateIntervalMins; + } + + void setPopulateIntervalMins(Integer populateIntervalMins) { + this.populateIntervalMins = populateIntervalMins; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrAuditLogsState.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrAuditLogsState.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrAuditLogsState.java new file mode 100644 index 0000000..546a5dc --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrAuditLogsState.java @@ -0,0 +1,68 @@ +/* + * 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.ambari.logsearch.conf.global; + +import javax.inject.Named; + +@Named +public class SolrAuditLogsState implements SolrCollectionState { + + private volatile boolean znodeReady; + private volatile boolean solrCollectionReady; + private volatile boolean solrAliasReady; + private volatile boolean configurationUploaded; + + @Override + public boolean isZnodeReady() { + return znodeReady; + } + + @Override + public void setZnodeReady(boolean znodeAvailable) { + this.znodeReady = znodeAvailable; + } + + @Override + public boolean isSolrCollectionReady() { + return solrCollectionReady; + } + + @Override + public void setSolrCollectionReady(boolean solrCollectionReady) { + this.solrCollectionReady = solrCollectionReady; + } + + @Override + public boolean isConfigurationUploaded() { + return configurationUploaded; + } + + @Override + public void setConfigurationUploaded(boolean configurationUploaded) { + this.configurationUploaded = configurationUploaded; + } + + public boolean isSolrAliasReady() { + return solrAliasReady; + } + + public void setSolrAliasReady(boolean solrAliasReady) { + this.solrAliasReady = solrAliasReady; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrCollectionState.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrCollectionState.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrCollectionState.java new file mode 100644 index 0000000..5885611 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrCollectionState.java @@ -0,0 +1,33 @@ +/* + * 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.ambari.logsearch.conf.global; + +public interface SolrCollectionState { + boolean isZnodeReady(); + + void setZnodeReady(boolean znodeAvailable); + + boolean isSolrCollectionReady(); + + void setSolrCollectionReady(boolean solrCollectionCreated); + + boolean isConfigurationUploaded(); + + void setConfigurationUploaded(boolean configurationUploaded); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrServiceLogsState.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrServiceLogsState.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrServiceLogsState.java new file mode 100644 index 0000000..60eafc5 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrServiceLogsState.java @@ -0,0 +1,59 @@ +/* + * 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.ambari.logsearch.conf.global; + +import javax.inject.Named; + +@Named +public class SolrServiceLogsState implements SolrCollectionState { + + private volatile boolean znodeReady; + private volatile boolean solrCollectionReady; + private volatile boolean configurationUploaded; + + @Override + public boolean isZnodeReady() { + return znodeReady; + } + + @Override + public void setZnodeReady(boolean znodeAvailable) { + this.znodeReady = znodeAvailable; + } + + @Override + public boolean isSolrCollectionReady() { + return solrCollectionReady; + } + + @Override + public void setSolrCollectionReady(boolean solrCollectionReady) { + this.solrCollectionReady = solrCollectionReady; + } + + @Override + public boolean isConfigurationUploaded() { + return configurationUploaded; + } + + @Override + public void setConfigurationUploaded(boolean configurationUploaded) { + this.configurationUploaded = configurationUploaded; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrUserConfigState.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrUserConfigState.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrUserConfigState.java new file mode 100644 index 0000000..06af14c --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/global/SolrUserConfigState.java @@ -0,0 +1,60 @@ +/* + * 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.ambari.logsearch.conf.global; + +import javax.inject.Named; + +@Named +public class SolrUserConfigState implements SolrCollectionState { + + private volatile boolean znodeReady; + private volatile boolean solrCollectionReady; + private volatile boolean configurationUploaded; + + @Override + public boolean isZnodeReady() { + return znodeReady; + } + + @Override + public void setZnodeReady(boolean znodeAvailable) { + this.znodeReady = znodeAvailable; + } + + @Override + public boolean isSolrCollectionReady() { + return solrCollectionReady; + } + + @Override + public void setSolrCollectionReady(boolean solrCollectionReady) { + this.solrCollectionReady = solrCollectionReady; + } + + @Override + public boolean isConfigurationUploaded() { + return configurationUploaded; + } + + @Override + public void setConfigurationUploaded(boolean configurationUploaded) { + this.configurationUploaded = configurationUploaded; + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/LogfeederFilterConfigurer.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/LogfeederFilterConfigurer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/LogfeederFilterConfigurer.java new file mode 100644 index 0000000..34e1bec --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/LogfeederFilterConfigurer.java @@ -0,0 +1,66 @@ +/* + * 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.ambari.logsearch.configurer; + +import org.apache.ambari.logsearch.conf.SolrPropsConfig; +import org.apache.ambari.logsearch.conf.global.SolrCollectionState; +import org.apache.ambari.logsearch.dao.UserConfigSolrDao; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class LogfeederFilterConfigurer implements SolrConfigurer { + + private static final Logger LOG = LoggerFactory.getLogger(LogfeederFilterConfigurer.class); + + private static final int SETUP_RETRY_SECOND = 10; + + private final UserConfigSolrDao userConfigSolrDao; + + public LogfeederFilterConfigurer(final UserConfigSolrDao userConfigSolrDao) { + this.userConfigSolrDao = userConfigSolrDao; + } + + @Override + public void start() { + final SolrPropsConfig solrPropsConfig = userConfigSolrDao.getSolrPropsConfig(); + final SolrCollectionState state = userConfigSolrDao.getSolrCollectionState(); + Thread setupFiltersThread = new Thread("logfeeder_filter_setup") { + @Override + public void run() { + LOG.info("logfeeder_filter_setup thread started (to upload logfeeder config)"); + while (true) { + int retryCount = 0; + try { + retryCount++; + Thread.sleep(SETUP_RETRY_SECOND * 1000); + if (state.isSolrCollectionReady()) { + LOG.info("Tries to initialize logfeeder filters in '{}' collection", solrPropsConfig.getCollection()); + userConfigSolrDao.getUserFilter(); + break; + } + } catch (Exception e) { + LOG.error("Not able to save logfeeder filter while initialization, retryCount=" + retryCount, e); + } + } + } + }; + setupFiltersThread.setDaemon(true); + setupFiltersThread.start(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrAuditAliasConfigurer.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrAuditAliasConfigurer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrAuditAliasConfigurer.java new file mode 100644 index 0000000..c80a10d --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrAuditAliasConfigurer.java @@ -0,0 +1,136 @@ +/* + * 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.ambari.logsearch.configurer; + +import org.apache.ambari.logsearch.conf.SolrAuditLogPropsConfig; +import org.apache.ambari.logsearch.conf.global.SolrAuditLogsState; +import org.apache.ambari.logsearch.dao.AuditSolrDao; +import org.apache.ambari.logsearch.handler.ListCollectionHandler; +import org.apache.commons.lang.StringUtils; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.CloudSolrClient; +import org.apache.solr.client.solrj.request.CollectionAdminRequest; +import org.apache.solr.client.solrj.response.CollectionAdminResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +public class SolrAuditAliasConfigurer implements SolrConfigurer { + + private static final Logger LOG = LoggerFactory.getLogger(SolrAuditAliasConfigurer.class); + + private static final int ALIAS_SETUP_RETRY_SECOND = 30 * 60; + + private final AuditSolrDao auditSolrDao; + + public SolrAuditAliasConfigurer(final AuditSolrDao auditSolrDao) { + this.auditSolrDao = auditSolrDao; + } + + @Override + public void start() { + final SolrAuditLogPropsConfig solrPropsConfig = (SolrAuditLogPropsConfig) auditSolrDao.getSolrPropsConfig(); + final SolrAuditLogsState state = (SolrAuditLogsState) auditSolrDao.getSolrCollectionState(); + final Collection<String> collectionListIn = + Arrays.asList(solrPropsConfig.getCollection(), solrPropsConfig.getRangerCollection().trim()); + + if (solrPropsConfig.getAliasNameIn() == null || collectionListIn.size() == 0) { + LOG.info("Will not create alias {} for {}", solrPropsConfig.getAliasNameIn(), collectionListIn.toString()); + return; + } + + LOG.info("setupAlias " + solrPropsConfig.getAliasNameIn() + " for " + collectionListIn.toString()); + // Start a background thread to do setup + Thread setupThread = new Thread("setup_alias_" + solrPropsConfig.getAliasNameIn()) { + @Override + public void run() { + LOG.info("Started monitoring thread to check availability of Solr server. alias=" + solrPropsConfig.getAliasNameIn() + + ", collections=" + collectionListIn.toString()); + int retryCount = 0; + while (true) { + if (state.isSolrCollectionReady()) { + try { + CloudSolrClient solrClient = auditSolrDao.getSolrClient(); + int count = createAlias(solrClient, solrPropsConfig.getAliasNameIn(), collectionListIn); + if (count > 0) { + solrClient.setDefaultCollection(solrPropsConfig.getAliasNameIn()); + if (count == collectionListIn.size()) { + LOG.info("Setup for alias " + solrPropsConfig.getAliasNameIn() + " is successful. Exiting setup retry thread. " + + "Collections=" + collectionListIn); + state.setSolrAliasReady(true); + break; + } + } else { + LOG.warn("Not able to create alias=" + solrPropsConfig.getAliasNameIn() + ", retryCount=" + retryCount); + } + } catch (Exception e) { + LOG.error("Error setting up alias=" + solrPropsConfig.getAliasNameIn(), e); + } + } + try { + Thread.sleep(ALIAS_SETUP_RETRY_SECOND * 1000); + } catch (InterruptedException sleepInterrupted) { + LOG.info("Sleep interrupted while setting up alias " + solrPropsConfig.getAliasNameIn()); + break; + } + retryCount++; + } + } + }; + setupThread.setDaemon(true); + setupThread.start(); + } + + private int createAlias(final CloudSolrClient solrClient, String aliasNameIn, Collection<String> collectionListIn) + throws SolrServerException, IOException { + List<String> collectionToAdd = new ArrayList<>(); + try { + collectionToAdd = new ListCollectionHandler().handle(solrClient, null); + } catch (Exception e) { + LOG.error("Invalid state during getting collections for creating alias"); + } + collectionToAdd.retainAll(collectionListIn); + + String collectionsCSV = null; + if (!collectionToAdd.isEmpty()) { + collectionsCSV = StringUtils.join(collectionToAdd, ','); + CollectionAdminRequest.CreateAlias aliasCreateRequest = new CollectionAdminRequest.CreateAlias(); + aliasCreateRequest.setAliasName(aliasNameIn); + aliasCreateRequest.setAliasedCollections(collectionsCSV); + CollectionAdminResponse createResponse = aliasCreateRequest.process(solrClient); + if (createResponse.getStatus() != 0) { + LOG.error("Error creating alias. alias=" + aliasNameIn + ", collectionList=" + collectionsCSV + + ", response=" + createResponse); + return 0; + } + } + if (collectionToAdd.size() == collectionListIn.size()) { + LOG.info("Created alias for all collections. alias=" + aliasNameIn + ", collectionsCSV=" + collectionsCSV); + } else { + LOG.info("Created alias for " + collectionToAdd.size() + " out of " + collectionListIn.size() + " collections. " + + "alias=" + aliasNameIn + ", collectionsCSV=" + collectionsCSV); + } + return collectionToAdd.size(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrCollectionConfigurer.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrCollectionConfigurer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrCollectionConfigurer.java new file mode 100644 index 0000000..7edc6aa --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrCollectionConfigurer.java @@ -0,0 +1,230 @@ +/* + * 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.ambari.logsearch.configurer; + +import org.apache.ambari.logsearch.conf.SolrPropsConfig; +import org.apache.ambari.logsearch.conf.global.SolrCollectionState; +import org.apache.ambari.logsearch.dao.SolrDaoBase; +import org.apache.ambari.logsearch.handler.ACLHandler; +import org.apache.ambari.logsearch.handler.CreateCollectionHandler; +import org.apache.ambari.logsearch.handler.ListCollectionHandler; +import org.apache.ambari.logsearch.handler.ReloadCollectionHandler; +import org.apache.ambari.logsearch.handler.UploadConfigurationHandler; +import org.apache.commons.lang.StringUtils; +import org.apache.solr.client.solrj.impl.CloudSolrClient; +import org.apache.solr.client.solrj.impl.HttpClientUtil; +import org.apache.solr.client.solrj.impl.Krb5HttpClientConfigurer; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.solr.core.SolrTemplate; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileSystems; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class SolrCollectionConfigurer implements SolrConfigurer { + + private Logger LOG = LoggerFactory.getLogger(SolrCollectionConfigurer.class); + + private static final int SETUP_RETRY_SECOND = 10; + private static final int SESSION_TIMEOUT = 15000; + private static final int CONNECTION_TIMEOUT = 30000; + + private final SolrDaoBase solrDaoBase; + + public SolrCollectionConfigurer(final SolrDaoBase solrDaoBase) { + this.solrDaoBase = solrDaoBase; + } + + @Override + public void start() { + setupSecurity(); + final SolrPropsConfig solrPropsConfig = solrDaoBase.getSolrPropsConfig(); + final SolrCollectionState state = solrDaoBase.getSolrCollectionState(); + final String separator = FileSystems.getDefault().getSeparator(); + final String localConfigSetLocation = String.format("%s%s%s%sconf", solrPropsConfig.getConfigSetFolder(), separator, + solrPropsConfig.getConfigName(), separator); + final File configSetFolder = new File(localConfigSetLocation); + if (!configSetFolder.exists()) { // show exception only once during startup + throw new RuntimeException(String.format("Cannot load config set location: %s", localConfigSetLocation)); + } + Thread setupThread = new Thread("setup_collection_" + solrPropsConfig.getCollection()) { + @Override + public void run() { + LOG.info("Started monitoring thread to check availability of Solr server. collection=" + solrPropsConfig.getCollection()); + while (!stopSetupCondition(state)) { + int retryCount = 0; + try { + retryCount++; + Thread.sleep(SETUP_RETRY_SECOND * 1000); + openZkConnectionAndUpdateStatus(state, solrPropsConfig); + if (solrDaoBase.getSolrTemplate() == null) { + solrDaoBase.setSolrTemplate(createSolrTemplate(solrPropsConfig)); + } + CloudSolrClient cloudSolrClient = (CloudSolrClient) solrDaoBase.getSolrTemplate().getSolrClient(); + boolean reloadCollectionNeeded = uploadConfigurationsIfNeeded(cloudSolrClient, configSetFolder, state, solrPropsConfig); + checkSolrStatus(cloudSolrClient); + createCollectionsIfNeeded(cloudSolrClient, state, solrPropsConfig, reloadCollectionNeeded); + } catch (Exception e) { + retryCount++; + LOG.error("Error setting collection. collection=" + solrPropsConfig.getCollection() + ", retryCount=" + retryCount, e); + } + } + } + }; + setupThread.setDaemon(true); + setupThread.start(); + } + + private boolean uploadConfigurationsIfNeeded(CloudSolrClient cloudSolrClient, File configSetFolder, SolrCollectionState state, SolrPropsConfig solrPropsConfig) throws Exception { + boolean reloadCollectionNeeded = new UploadConfigurationHandler(configSetFolder).handle(cloudSolrClient, solrPropsConfig); + if (!state.isConfigurationUploaded()) { + state.setConfigurationUploaded(true); + } + return reloadCollectionNeeded; + } + + public boolean stopSetupCondition(SolrCollectionState state) { + return state.isSolrCollectionReady(); + } + + public SolrTemplate createSolrTemplate(SolrPropsConfig solrPropsConfig) { + return new SolrTemplate(createClient( + solrPropsConfig.getSolrUrl(), + solrPropsConfig.getZkConnectString(), + solrPropsConfig.getCollection())); + } + + private CloudSolrClient createClient(String solrUrl, String zookeeperConnectString, String defaultCollection) { + if (StringUtils.isNotEmpty(zookeeperConnectString)) { + CloudSolrClient cloudSolrClient = new CloudSolrClient(zookeeperConnectString); + cloudSolrClient.setDefaultCollection(defaultCollection); + return cloudSolrClient; + } else if (StringUtils.isNotEmpty(solrUrl)) { + throw new UnsupportedOperationException("Currently only cloud mode is supported. Set zookeeper connect string."); + } + throw new IllegalStateException( + "Solr url or zookeeper connection string is missing. collection: " + defaultCollection); + } + + private void setupSecurity() { + String jaasFile = solrDaoBase.getSolrKerberosConfig().getJaasFile(); + boolean securityEnabled = solrDaoBase.getSolrKerberosConfig().isEnabled(); + if (securityEnabled) { + System.setProperty("java.security.auth.login.config", jaasFile); + HttpClientUtil.setConfigurer(new Krb5HttpClientConfigurer()); + LOG.info("setupSecurity() called for kerberos configuration, jaas file: " + jaasFile); + } + } + + private void openZkConnectionAndUpdateStatus(final SolrCollectionState state, final SolrPropsConfig solrPropsConfig) throws Exception { + ZooKeeper zkClient = null; + try { + LOG.info("Checking that Znode ('{}') is ready or not... ", solrPropsConfig.getZkConnectString()); + zkClient = openZookeeperConnection(solrPropsConfig); + if (!state.isZnodeReady()) { + LOG.info("State change: Zookeeper ZNode is available for {}", solrPropsConfig.getZkConnectString()); + state.setZnodeReady(true); + } + } catch (Exception e) { + LOG.error("Error occurred during the creation of zk client (connection string: {})", solrPropsConfig.getZkConnectString()); + throw e; + } finally { + try { + if (zkClient != null) { + zkClient.close(); + } + } catch (Exception e) { + LOG.error("Could not close zk connection properly.", e); + } + } + } + + private ZooKeeper openZookeeperConnection(final SolrPropsConfig solrPropsConfig) throws InterruptedException, IOException { + final CountDownLatch connSignal = new CountDownLatch(1); + ZooKeeper zooKeeper = new ZooKeeper(solrPropsConfig.getZkConnectString(), SESSION_TIMEOUT, new Watcher() { + public void process(WatchedEvent event) { + if (event.getState() == Event.KeeperState.SyncConnected) { + connSignal.countDown(); + } + } + }); + connSignal.await(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS); + return zooKeeper; + } + + private boolean checkSolrStatus(CloudSolrClient cloudSolrClient) { + int waitDurationMS = 3 * 60 * 1000; + boolean status = false; + try { + long beginTimeMS = System.currentTimeMillis(); + long waitIntervalMS = 2000; + int pingCount = 0; + while (true) { + pingCount++; + try { + List<String> collectionList = new ListCollectionHandler().handle(cloudSolrClient, null); + if (collectionList != null) { + LOG.info("checkSolrStatus(): Solr getCollections() is success. collectionList=" + collectionList); + status = true; + break; + } + } catch (Exception ex) { + LOG.error("Error while doing Solr check", ex); + } + if (System.currentTimeMillis() - beginTimeMS > waitDurationMS) { + LOG.error("Solr is not reachable even after " + (System.currentTimeMillis() - beginTimeMS) + " ms. " + + "If you are using alias, then you might have to restart LogSearch after Solr is up and running."); + break; + } else { + LOG.warn("Solr is not not reachable yet. getCollections() attempt count=" + pingCount + ". " + + "Will sleep for " + waitIntervalMS + " ms and try again."); + } + Thread.sleep(waitIntervalMS); + + } + } catch (Throwable t) { + LOG.error("Seems Solr is not up."); + } + return status; + } + + private void createCollectionsIfNeeded(CloudSolrClient solrClient, SolrCollectionState state, SolrPropsConfig solrPropsConfig, boolean reloadCollectionNeeded) { + try { + List<String> allCollectionList = new ListCollectionHandler().handle(solrClient, null); + boolean collectionCreated = new CreateCollectionHandler(allCollectionList).handle(solrClient, solrPropsConfig); + boolean collectionReloaded = true; + if (reloadCollectionNeeded) { + collectionReloaded = new ReloadCollectionHandler().handle(solrClient, solrPropsConfig); + } + boolean aclsUpdated = new ACLHandler().handle(solrClient, solrPropsConfig); + if (!state.isSolrCollectionReady() && collectionCreated && collectionReloaded && aclsUpdated) { + state.setSolrCollectionReady(true); + } + } catch (Exception ex) { + LOG.error("Error during creating/updating collection. collectionName=" + solrPropsConfig.getCollection(), ex); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrConfigurer.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrConfigurer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrConfigurer.java new file mode 100644 index 0000000..67cb9d1 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/configurer/SolrConfigurer.java @@ -0,0 +1,23 @@ +/* + * 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.ambari.logsearch.configurer; + +interface SolrConfigurer { + void start(); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractAuditLogRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractAuditLogRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractAuditLogRequestQueryConverter.java new file mode 100644 index 0000000..5656c88 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractAuditLogRequestQueryConverter.java @@ -0,0 +1,59 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogSearchConstants; +import org.apache.ambari.logsearch.model.request.impl.BaseLogRequest; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Sort; +import org.springframework.data.solr.core.query.Query; + +import java.util.List; + +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_COMPONENT; +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_EVTTIME; +import static org.apache.ambari.logsearch.solr.SolrConstants.CommonLogConstants.SEQUENCE_ID; + +public abstract class AbstractAuditLogRequestQueryConverter<SOURCE extends BaseLogRequest, RESULT extends Query> + extends AbstractLogRequestQueryConverter<SOURCE, RESULT>{ + + @Override + public Sort sort(SOURCE request) { + String sortBy = request.getSortBy(); + String sortType = request.getSortType(); + Sort.Order defaultSortOrder; + if (StringUtils.isNotBlank(sortBy)) { + Sort.Direction direction = StringUtils.equals(sortType , LogSearchConstants.ASCENDING_ORDER) ? Sort.Direction.ASC : Sort.Direction.DESC; + defaultSortOrder = new Sort.Order(direction, sortBy); + } else { + defaultSortOrder = new Sort.Order(Sort.Direction.DESC, AUDIT_EVTTIME); + } + Sort.Order sequenceIdOrder = new Sort.Order(Sort.Direction.DESC, SEQUENCE_ID); + return new Sort(defaultSortOrder, sequenceIdOrder); + } + + @Override + public void addComponentFilters(SOURCE request, RESULT query) { + List<String> includeTypes = splitValueAsList(request.getMustBe(), ","); + List<String> excludeTypes = splitValueAsList(request.getMustNot(), ","); + addInFilterQuery(query, AUDIT_COMPONENT, includeTypes); + addInFilterQuery(query, AUDIT_COMPONENT, excludeTypes, true); + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractConverterAware.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractConverterAware.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractConverterAware.java new file mode 100644 index 0000000..a4db91f --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractConverterAware.java @@ -0,0 +1,47 @@ +/* + * 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.ambari.logsearch.converter; + +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterRegistry; + +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Named; + +public abstract class AbstractConverterAware<SOURCE, RESULT> implements Converter<SOURCE, RESULT> { + + @Inject + @Named("conversionService") + private ConversionService conversionService; + + public ConversionService getConversionService() { + return conversionService; + } + + @PostConstruct + private void register() { + if (conversionService instanceof ConverterRegistry) { + ((ConverterRegistry) conversionService).addConverter(this); + } else { + throw new IllegalStateException("Can't register Converter to ConverterRegistry"); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractDateRangeFacetQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractDateRangeFacetQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractDateRangeFacetQueryConverter.java new file mode 100644 index 0000000..2143f56 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractDateRangeFacetQueryConverter.java @@ -0,0 +1,55 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogSearchConstants; +import org.apache.ambari.logsearch.model.request.DateRangeParamDefinition; +import org.apache.ambari.logsearch.model.request.UnitParamDefinition; +import org.apache.commons.lang.StringUtils; +import org.apache.solr.client.solrj.SolrQuery; + +import java.util.Locale; + +public abstract class AbstractDateRangeFacetQueryConverter<SOURCE extends DateRangeParamDefinition & UnitParamDefinition> + extends AbstractOperationHolderConverter<SOURCE , SolrQuery> { + + @Override + public SolrQuery convert(SOURCE request) { + SolrQuery solrQuery = new SolrQuery(); + String unit = StringUtils.defaultIfEmpty(request.getUnit(), "+1HOUR"); + solrQuery.setQuery("*:*"); + solrQuery.setFacet(true); + solrQuery.addFacetPivotField("{!range=r1}" + getTypeFieldName()); + solrQuery.setFacetMinCount(1); + solrQuery.setFacetLimit(-1); + solrQuery.setFacetSort(LogSearchConstants.FACET_INDEX); + solrQuery.add("facet.range", "{!tag=r1}" + getDateFieldName()); + solrQuery.add(String.format(Locale.ROOT, "f.%s.%s", new Object[]{getDateFieldName(), "facet.range.start"}), request.getFrom()); + solrQuery.add(String.format(Locale.ROOT, "f.%s.%s", new Object[]{getDateFieldName(), "facet.range.end"}), request.getTo()); + solrQuery.add(String.format(Locale.ROOT, "f.%s.%s", new Object[]{getDateFieldName(), "facet.range.gap"}), unit); + solrQuery.remove("sort"); + solrQuery.setRows(0); + solrQuery.setStart(0); + return solrQuery; + } + + public abstract String getDateFieldName(); + + public abstract String getTypeFieldName(); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestFacetQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestFacetQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestFacetQueryConverter.java new file mode 100644 index 0000000..d5e807b --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestFacetQueryConverter.java @@ -0,0 +1,88 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.BaseLogRequest; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.data.solr.core.query.Criteria; +import org.springframework.data.solr.core.query.FacetOptions; +import org.springframework.data.solr.core.query.SimpleFacetQuery; +import org.springframework.data.solr.core.query.SimpleFilterQuery; +import org.springframework.data.solr.core.query.SimpleStringCriteria; + +import java.util.List; + +import static org.apache.ambari.logsearch.solr.SolrConstants.CommonLogConstants.CLUSTER; +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.COMPONENT; +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_COMPONENT; + +public abstract class AbstractLogRequestFacetQueryConverter<SOURCE extends BaseLogRequest> extends AbstractOperationHolderConverter<SOURCE, SimpleFacetQuery>{ + + @Override + public SimpleFacetQuery convert(SOURCE request) { + String fromValue = StringUtils.isNotEmpty(request.getFrom()) ? request.getFrom() : "*"; + String toValue = StringUtils.isNotEmpty(request.getTo()) ? request.getTo() : "*"; + Criteria criteria = new SimpleStringCriteria("*:*"); + SimpleFacetQuery facetQuery = new SimpleFacetQuery(); + facetQuery.addCriteria(criteria); + SimpleFilterQuery simpleFilterQuery = new SimpleFilterQuery(); + simpleFilterQuery.addCriteria(new SimpleStringCriteria(getDateTimeField() + ":[" + fromValue +" TO "+ toValue+ "]" )); + facetQuery.addFilterQuery(simpleFilterQuery); + FacetOptions facetOptions = new FacetOptions(); + facetOptions.setFacetMinCount(1); + facetOptions.setFacetSort(getFacetSort()); + facetOptions.setFacetLimit(-1); + appendFacetOptions(facetOptions, request); + addIncludeFieldValues(facetQuery, StringEscapeUtils.unescapeXml(request.getIncludeQuery())); + addExcludeFieldValues(facetQuery, StringEscapeUtils.unescapeXml(request.getExcludeQuery())); + facetQuery.setFacetOptions(facetOptions); + facetQuery.setRows(0); + addComponentFilters(facetQuery, request); + appendFacetQuery(facetQuery, request); + addInFilterQuery(facetQuery, CLUSTER, splitValueAsList(request.getClusters(), ",")); + return facetQuery; + } + + public abstract FacetOptions.FacetSort getFacetSort(); + + public abstract String getDateTimeField(); + + public abstract LogType getLogType(); + + public void appendFacetQuery(SimpleFacetQuery facetQuery, SOURCE request) { + } + + public void appendFacetOptions(FacetOptions facetOptions, SOURCE request) { + facetOptions.setFacetLimit(-1); + } + + private void addComponentFilters(SimpleFacetQuery query, SOURCE request) { + List<String> includeTypes = splitValueAsList(request.getMustBe(), ","); + List<String> excludeTypes = splitValueAsList(request.getMustNot(), ","); + if (LogType.AUDIT.equals(getLogType())) { + addInFilterQuery(query, AUDIT_COMPONENT, includeTypes); + addInFilterQuery(query, AUDIT_COMPONENT, excludeTypes, true); + } else if (LogType.SERVICE.equals(getLogType())) { + addInFilterQuery(query, COMPONENT, includeTypes); + addInFilterQuery(query, COMPONENT, excludeTypes, true); + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestQueryConverter.java new file mode 100644 index 0000000..d9f51f4 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractLogRequestQueryConverter.java @@ -0,0 +1,42 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.model.request.impl.BaseLogRequest; +import org.apache.commons.lang.StringEscapeUtils; +import org.springframework.data.solr.core.query.Query; + +import static org.apache.ambari.logsearch.solr.SolrConstants.CommonLogConstants.CLUSTER; + +public abstract class AbstractLogRequestQueryConverter<REQUEST_TYPE extends BaseLogRequest, QUERY_TYPE extends Query> + extends AbstractSearchRequestQueryConverter<REQUEST_TYPE, QUERY_TYPE> { + + @Override + public QUERY_TYPE extendSolrQuery(REQUEST_TYPE request, QUERY_TYPE query) { + addComponentFilters(request, query); + addIncludeFieldValues(query, StringEscapeUtils.unescapeXml(request.getIncludeQuery())); + addExcludeFieldValues(query, StringEscapeUtils.unescapeXml(request.getExcludeQuery())); + addInFilterQuery(query, CLUSTER, splitValueAsList(request.getClusters(), ",")); + return extendLogQuery(request, query); + } + + public abstract QUERY_TYPE extendLogQuery(REQUEST_TYPE request, QUERY_TYPE query); + + public abstract void addComponentFilters(REQUEST_TYPE request, QUERY_TYPE query); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractOperationHolderConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractOperationHolderConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractOperationHolderConverter.java new file mode 100644 index 0000000..c92dd14 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractOperationHolderConverter.java @@ -0,0 +1,180 @@ +/* + * 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.ambari.logsearch.converter; + +import com.google.common.base.Splitter; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.dao.SolrSchemaFieldDao; +import org.apache.ambari.logsearch.util.SolrUtil; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.text.StrTokenizer; +import org.apache.solr.client.solrj.SolrQuery; +import org.springframework.data.solr.core.query.Criteria; +import org.springframework.data.solr.core.query.Query; +import org.springframework.data.solr.core.query.SimpleFilterQuery; +import org.springframework.data.solr.core.query.SimpleStringCriteria; + +import javax.inject.Inject; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.LOG_MESSAGE; + +public abstract class AbstractOperationHolderConverter <REQUEST_TYPE, QUERY_TYPE> + extends AbstractConverterAware<REQUEST_TYPE, QUERY_TYPE> { + + @Inject + private SolrSchemaFieldDao solrSchemaFieldDao; + + public List<String> splitValueAsList(String value, String separator) { + return StringUtils.isNotEmpty(value) ? Splitter.on(separator).omitEmptyStrings().splitToList(value) : null; + } + + public Query addEqualsFilterQuery(Query query, String field, String value) { + return this.addEqualsFilterQuery(query, field, value, false); + } + + public Query addEqualsFilterQuery(Query query, String field, String value, boolean negate) { + if (StringUtils.isNotEmpty(value)) { + addFilterQuery(query, new Criteria(field).is(value), negate); + } + return query; + } + + public Query addContainsFilterQuery(Query query, String field, String value) { + return this.addContainsFilterQuery(query, field, value, false); + } + + public Query addContainsFilterQuery(Query query, String field, String value, boolean negate) { + if (StringUtils.isNotEmpty(value)) { + addFilterQuery(query, new Criteria(field).contains(value), negate); + } + return query; + } + + public Query addInFilterQuery(Query query, String field, List<String> values) { + return this.addInFilterQuery(query, field, values, false); + } + + public Query addInFiltersIfNotNullAndEnabled(Query query, String value, String field, boolean condition) { + if (value != null && condition) { + List<String> values = value.length() == 0 ? Arrays.asList("-1") : splitValueAsList(value, ","); + addInFilterQuery(query, field, values); + } + return query; + } + + public Query addInFilterQuery(Query query, String field, List<String> values, boolean negate) { + if (CollectionUtils.isNotEmpty(values)) { + addFilterQuery(query, new Criteria(field).is(values), negate); + } + return query; + } + + public Query addRangeFilter(Query query, String field, String from, String to) { + return this.addRangeFilter(query, field, from, to, false); + } + + public Query addRangeFilter(Query query, String field, String from, String to, boolean negate) { // TODO use criteria.between without escaping + String fromValue = StringUtils.defaultIfEmpty(from, "*"); + String toValue = StringUtils.defaultIfEmpty(to, "*"); + addFilterQuery(query, new SimpleStringCriteria(field + ":[" + fromValue +" TO "+ toValue + "]" ), negate); + return query; + } + + public void addFilterQuery(Query query, Criteria criteria, boolean negate) { + if (negate) { + criteria.not(); + } + query.addFilterQuery(new SimpleFilterQuery(criteria)); + } + + public Query addIncludeFieldValues(Query query, String fieldValuesMapStr) { + if (StringUtils.isNotEmpty(fieldValuesMapStr)) { + List<Map<String, String>> criterias = new Gson().fromJson(fieldValuesMapStr, + new TypeToken<List<HashMap<String, String>>>(){}.getType()); + for (Map<String, String> criteriaMap : criterias) { + for (Map.Entry<String, String> fieldEntry : criteriaMap.entrySet()) { + if (fieldEntry.getKey().equalsIgnoreCase(LOG_MESSAGE)) { + addLogMessageFilter(query, fieldEntry.getValue(), false); + } else { + addFilterQuery(query, new Criteria(fieldEntry.getKey()).is(escapeNonLogMessageField(fieldEntry)), false); + } + } + } + } + return query; + } + + public Query addExcludeFieldValues(Query query, String fieldValuesMapStr) { + if (StringUtils.isNotEmpty(fieldValuesMapStr)) { + List<Map<String, String>> criterias = new Gson().fromJson(fieldValuesMapStr, + new TypeToken<List<HashMap<String, String>>>(){}.getType()); + for (Map<String, String> criteriaMap : criterias) { + for (Map.Entry<String, String> fieldEntry : criteriaMap.entrySet()) { + if (fieldEntry.getKey().equalsIgnoreCase(LOG_MESSAGE)) { + addLogMessageFilter(query, fieldEntry.getValue(), true); + } else { + addFilterQuery(query, new Criteria(fieldEntry.getKey()).is(escapeNonLogMessageField(fieldEntry)), true); + } + } + } + } + return query; + } + + public SolrQuery addListFilterToSolrQuery(SolrQuery solrQuery, String fieldName, String fieldValue) { + return SolrUtil.addListFilterToSolrQuery(solrQuery, fieldName, fieldValue); + } + + public abstract LogType getLogType(); + + private void addLogMessageFilter(Query query, String value, boolean negate) { + StrTokenizer tokenizer = new StrTokenizer(value, ' ', '"'); + for (String token : tokenizer.getTokenArray()) { + token = token.trim(); + if (token.contains(" ") || !token.startsWith("*") && !token.endsWith("*")) { + addFilterQuery(query, new Criteria(LOG_MESSAGE).is(SolrUtil.escapeQueryChars(token)), negate); + } else if (token.startsWith("*") && token.endsWith("*")) { + String plainToken = StringUtils.substring(token, 1, -1); + addFilterQuery(query, new Criteria(LOG_MESSAGE).contains(SolrUtil.escapeQueryChars(plainToken)), negate); + } else if (token.startsWith("*") && !token.endsWith("*")) { + String plainToken = StringUtils.substring(token, 1); + addFilterQuery(query, new Criteria(LOG_MESSAGE).endsWith(SolrUtil.escapeQueryChars(plainToken)), negate); + } else if (!token.startsWith("*") && token.endsWith("*")) { + String plainToken = StringUtils.substring(token, 0, -1); + addFilterQuery(query, new Criteria(LOG_MESSAGE).startsWith(SolrUtil.escapeQueryChars(plainToken)), negate); + } + } + } + + private String escapeNonLogMessageField(Map.Entry<String, String> fieldEntry) { + Map<String, String> schemaFieldNameMap = solrSchemaFieldDao.getSchemaFieldNameMap(getLogType()); + Map<String, String> schemaFieldTypeMap = solrSchemaFieldDao.getSchemaFieldTypeMap(getLogType()); + String fieldType = schemaFieldNameMap.get(fieldEntry.getKey()); + String fieldTypeMetaData = schemaFieldTypeMap.get(fieldType); + return SolrUtil.putWildCardByType(fieldEntry.getValue(), fieldType, fieldTypeMetaData); + } + +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java new file mode 100644 index 0000000..d4fc48b --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractSearchRequestQueryConverter.java @@ -0,0 +1,72 @@ +/* + * 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.ambari.logsearch.converter; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.ambari.logsearch.model.request.LastPageParamDefinition; +import org.apache.ambari.logsearch.model.request.impl.CommonSearchRequest; +import org.apache.commons.lang.StringUtils; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.solr.core.query.Criteria; +import org.springframework.data.solr.core.query.Query; +import org.springframework.data.solr.core.query.SimpleStringCriteria; + +public abstract class AbstractSearchRequestQueryConverter<REQUEST_TYPE extends CommonSearchRequest, QUERY_TYPE extends Query> + extends AbstractOperationHolderConverter<REQUEST_TYPE, QUERY_TYPE> { + + @Override + public QUERY_TYPE convert(REQUEST_TYPE request) { + QUERY_TYPE query = createQuery(); + addPageRequest(request, query); + Criteria criteria = new SimpleStringCriteria("*:*"); + query.addCriteria(criteria); + return extendSolrQuery(request, query); + } + + private void addPageRequest(REQUEST_TYPE request, QUERY_TYPE query) { + int page = StringUtils.isNumeric(request.getPage()) ? new Integer(request.getPage()) : 0; + int pageSize = StringUtils.isNumeric(request.getPageSize()) ? new Integer(request.getPageSize()) : 99999; + Sort sort = sort(request); + + boolean isLastPage = (request instanceof LastPageParamDefinition) ? + ((LastPageParamDefinition)request).isLastPage() : + false; + if (isLastPage) { + page = 0; + List<Sort.Order> newOrders = new ArrayList<>(); + for (Sort.Order order : sort) { + newOrders.add(new Sort.Order(order.getDirection() == Direction.ASC ? Direction.DESC : Direction.ASC, order.getProperty())); + } + sort = new Sort(newOrders); + } + + PageRequest pageRequest = new PageRequest(page, pageSize, sort); + query.setPageRequest(pageRequest); + } + + public abstract QUERY_TYPE extendSolrQuery(REQUEST_TYPE request, QUERY_TYPE query); + + public abstract Sort sort(REQUEST_TYPE request); + + public abstract QUERY_TYPE createQuery(); +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestFacetQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestFacetQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestFacetQueryConverter.java new file mode 100644 index 0000000..0fc12e8 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestFacetQueryConverter.java @@ -0,0 +1,44 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.model.request.impl.BaseServiceLogRequest; +import org.apache.ambari.logsearch.util.SolrUtil; +import org.apache.commons.lang.StringUtils; +import org.springframework.data.solr.core.query.SimpleFacetQuery; + +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.BUNDLE_ID; +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.COMPONENT; +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.HOST; +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.LEVEL; +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.PATH; + +public abstract class AbstractServiceLogRequestFacetQueryConverter<SOURCE extends BaseServiceLogRequest> + extends AbstractLogRequestFacetQueryConverter<SOURCE> { + + @Override + public void appendFacetQuery(SimpleFacetQuery facetQuery, SOURCE request) { + addEqualsFilterQuery(facetQuery, HOST, SolrUtil.escapeQueryChars(request.getHostName())); + addEqualsFilterQuery(facetQuery, PATH, SolrUtil.escapeQueryChars(request.getFileName())); + addEqualsFilterQuery(facetQuery, COMPONENT, SolrUtil.escapeQueryChars(request.getComponentName())); + addEqualsFilterQuery(facetQuery, BUNDLE_ID, request.getBundleId()); + addInFiltersIfNotNullAndEnabled(facetQuery, request.getLevel(), LEVEL, true); + addInFiltersIfNotNullAndEnabled(facetQuery, request.getHostList(), HOST, StringUtils.isEmpty(request.getHostName())); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestQueryConverter.java new file mode 100644 index 0000000..e1cd077 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AbstractServiceLogRequestQueryConverter.java @@ -0,0 +1,44 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.BaseLogRequest; +import org.springframework.data.solr.core.query.Query; + +import java.util.List; + +import static org.apache.ambari.logsearch.solr.SolrConstants.ServiceLogConstants.COMPONENT; + +public abstract class AbstractServiceLogRequestQueryConverter<REQUEST_TYPE extends BaseLogRequest, QUERY_TYPE extends Query> + extends AbstractLogRequestQueryConverter<REQUEST_TYPE, QUERY_TYPE> { + + @Override + public LogType getLogType() { + return LogType.SERVICE; + } + + @Override + public void addComponentFilters(REQUEST_TYPE request, QUERY_TYPE query) { + List<String> includeTypes = splitValueAsList(request.getMustBe(), ","); + List<String> excludeTypes = splitValueAsList(request.getMustNot(), ","); + addInFilterQuery(query, COMPONENT, includeTypes); + addInFilterQuery(query, COMPONENT, excludeTypes, true); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditBarGraphRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditBarGraphRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditBarGraphRequestQueryConverter.java new file mode 100644 index 0000000..06dfae9 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditBarGraphRequestQueryConverter.java @@ -0,0 +1,55 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.AuditBarGraphRequest; +import org.apache.solr.client.solrj.SolrQuery; + +import javax.inject.Named; + +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_COMPONENT; +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_EVTTIME; +import static org.apache.ambari.logsearch.solr.SolrConstants.CommonLogConstants.CLUSTER; + +@Named +public class AuditBarGraphRequestQueryConverter extends AbstractDateRangeFacetQueryConverter<AuditBarGraphRequest> { + + @Override + public String getDateFieldName() { + return AUDIT_EVTTIME; + } + + @Override + public String getTypeFieldName() { + return AUDIT_COMPONENT; + } + + @Override + public LogType getLogType() { + return LogType.AUDIT; + } + + @Override + public SolrQuery convert(AuditBarGraphRequest request) { + SolrQuery query = super.convert(request); + addListFilterToSolrQuery(query, CLUSTER, request.getClusters()); + return query; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditComponentsRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditComponentsRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditComponentsRequestQueryConverter.java new file mode 100644 index 0000000..bf77444 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditComponentsRequestQueryConverter.java @@ -0,0 +1,53 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.AuditComponentRequest; +import org.springframework.data.solr.core.query.FacetOptions; + +import javax.inject.Named; + +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_COMPONENT; +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_EVTTIME; + +@Named +public class AuditComponentsRequestQueryConverter extends AbstractLogRequestFacetQueryConverter<AuditComponentRequest> { + + @Override + public FacetOptions.FacetSort getFacetSort() { + return FacetOptions.FacetSort.INDEX; + } + + @Override + public String getDateTimeField() { + return AUDIT_EVTTIME; + } + + @Override + public LogType getLogType() { + return LogType.AUDIT; + } + + @Override + public void appendFacetOptions(FacetOptions facetOptions, AuditComponentRequest request) { + facetOptions.addFacetOnField(AUDIT_COMPONENT); + facetOptions.setFacetLimit(-1); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditLogRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditLogRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditLogRequestQueryConverter.java new file mode 100644 index 0000000..a2c1d81 --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditLogRequestQueryConverter.java @@ -0,0 +1,44 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.AuditLogRequest; +import org.springframework.data.solr.core.query.SimpleQuery; + +import javax.inject.Named; + +@Named +public class AuditLogRequestQueryConverter extends AbstractAuditLogRequestQueryConverter<AuditLogRequest, SimpleQuery> { + + @Override + public SimpleQuery extendLogQuery(AuditLogRequest request, SimpleQuery query) { + return query; + } + + @Override + public SimpleQuery createQuery() { + return new SimpleQuery(); + } + + @Override + public LogType getLogType() { + return LogType.AUDIT; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/b0f1e340/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditServiceLoadRequestQueryConverter.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditServiceLoadRequestQueryConverter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditServiceLoadRequestQueryConverter.java new file mode 100644 index 0000000..d88ec6d --- /dev/null +++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/AuditServiceLoadRequestQueryConverter.java @@ -0,0 +1,53 @@ +/* + * 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.ambari.logsearch.converter; + +import org.apache.ambari.logsearch.common.LogType; +import org.apache.ambari.logsearch.model.request.impl.AuditServiceLoadRequest; +import org.springframework.data.solr.core.query.FacetOptions; + +import javax.inject.Named; + +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_EVTTIME; +import static org.apache.ambari.logsearch.solr.SolrConstants.AuditLogConstants.AUDIT_COMPONENT; + +@Named +public class AuditServiceLoadRequestQueryConverter extends AbstractLogRequestFacetQueryConverter<AuditServiceLoadRequest> { + + @Override + public FacetOptions.FacetSort getFacetSort() { + return FacetOptions.FacetSort.COUNT; + } + + @Override + public String getDateTimeField() { + return AUDIT_EVTTIME; + } + + @Override + public LogType getLogType() { + return LogType.AUDIT; + } + + @Override + public void appendFacetOptions(FacetOptions facetOptions, AuditServiceLoadRequest request) { + facetOptions.addFacetOnField(AUDIT_COMPONENT); + facetOptions.setFacetLimit(10); + } +}