You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mg...@apache.org on 2017/04/25 13:53:48 UTC
ambari git commit: AMBARI-20807 Log Search REST API calls for
configuration should send proper error responses (mgergely)
Repository: ambari
Updated Branches:
refs/heads/trunk 1b7c023d0 -> e8e997a36
AMBARI-20807 Log Search REST API calls for configuration should send proper error responses (mgergely)
Change-Id: I23595470db557a5fa746fd02cb51caa35d96a44f
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e8e997a3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e8e997a3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e8e997a3
Branch: refs/heads/trunk
Commit: e8e997a36e38a38ac7ca4695377ba800a8427f87
Parents: 1b7c023
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Tue Apr 25 15:53:37 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Tue Apr 25 15:53:37 2017 +0200
----------------------------------------------------------------------
.../ambari/logsearch/common/MessageEnums.java | 3 +-
.../ambari/logsearch/conf/SecurityConfig.java | 15 +++
.../logsearch/manager/ShipperConfigManager.java | 19 ----
.../logsearch/rest/ShipperConfigResource.java | 4 +-
.../web/filters/LogSearchConfigStateFilter.java | 102 +++++++++++++++++++
.../scripts/logsearch_config_aggregator.py | 77 --------------
.../LOGSEARCH/0.5.0/package/scripts/params.py | 3 -
7 files changed, 121 insertions(+), 102 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/MessageEnums.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/MessageEnums.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/MessageEnums.java
index 4f1725f..9dd8b34 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/MessageEnums.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/MessageEnums.java
@@ -33,7 +33,8 @@ public enum MessageEnums {
ZNODE_NOT_READY("logsearch.zk.znode.error", "ZNode is not available."),
ZK_CONFIG_NOT_READY("logsearch.zk.config.error", "Collection configuration has not uploaded yet"),
SOLR_COLLECTION_NOT_READY("logsearch.solr.collection.error", "Solr has not accessible yet for collection."),
-
+ CONFIGURATION_NOT_AVAILABLE("logsearch.config.not_available", "Log Search configuration is not available"),
+
// Common Validations
INVALID_PASSWORD("logsearch.validation.invalid_password", "Invalid password"),
INVALID_INPUT_DATA("logsearch.validation.invalid_input_data", "Invalid input data"),
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SecurityConfig.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SecurityConfig.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SecurityConfig.java
index 2f9cba4..973dc4b 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SecurityConfig.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/conf/SecurityConfig.java
@@ -19,6 +19,8 @@
package org.apache.ambari.logsearch.conf;
import com.google.common.collect.Lists;
+
+import org.apache.ambari.logsearch.conf.global.LogSearchConfigState;
import org.apache.ambari.logsearch.conf.global.SolrCollectionState;
import org.apache.ambari.logsearch.web.authenticate.LogsearchAuthFailureHandler;
import org.apache.ambari.logsearch.web.authenticate.LogsearchAuthSuccessHandler;
@@ -26,6 +28,7 @@ import org.apache.ambari.logsearch.web.authenticate.LogsearchLogoutSuccessHandle
import org.apache.ambari.logsearch.web.filters.LogsearchAuditLogsStateFilter;
import org.apache.ambari.logsearch.web.filters.LogsearchAuthenticationEntryPoint;
import org.apache.ambari.logsearch.web.filters.LogsearchCorsFilter;
+import org.apache.ambari.logsearch.web.filters.LogSearchConfigStateFilter;
import org.apache.ambari.logsearch.web.filters.LogsearchKRBAuthenticationFilter;
import org.apache.ambari.logsearch.web.filters.LogsearchJWTFilter;
import org.apache.ambari.logsearch.web.filters.LogsearchSecurityContextFormationFilter;
@@ -82,6 +85,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Named("solrUserConfigState")
private SolrCollectionState solrUserConfigState;
+ @Inject
+ private LogSearchConfigState logSearchConfigState;
+
@Override
protected void configure(HttpSecurity http) throws Exception {
http
@@ -108,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.addFilterAfter(logsearchUserConfigFilter(), LogsearchSecurityContextFormationFilter.class)
.addFilterAfter(logsearchAuditLogFilter(), LogsearchSecurityContextFormationFilter.class)
.addFilterAfter(logsearchServiceLogFilter(), LogsearchSecurityContextFormationFilter.class)
+ .addFilterAfter(logSearchConfigStateFilter(), LogsearchSecurityContextFormationFilter.class)
.addFilterBefore(corsFilter(), LogsearchSecurityContextFormationFilter.class)
.addFilterBefore(logsearchJwtFilter(), LogsearchSecurityContextFormationFilter.class)
.logout()
@@ -175,6 +182,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
public LogsearchUserConfigStateFilter logsearchUserConfigFilter() {
return new LogsearchUserConfigStateFilter(userConfigRequestMatcher(), solrUserConfigState, solrUserPropsConfig);
}
+
+ public LogSearchConfigStateFilter logSearchConfigStateFilter() {
+ return new LogSearchConfigStateFilter(logsearchConfigRequestMatcher(), logSearchConfigState);
+ }
@Bean
public RequestMatcher requestMatcher() {
@@ -206,4 +217,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
return new AntPathRequestMatcher("/api/v1/userconfig/**");
}
+ public RequestMatcher logsearchConfigRequestMatcher() {
+ return new AntPathRequestMatcher("/api/v1/shipper/**");
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/ShipperConfigManager.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/ShipperConfigManager.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/ShipperConfigManager.java
index 251619b..c0c1167 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/ShipperConfigManager.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/ShipperConfigManager.java
@@ -21,7 +21,6 @@ package org.apache.ambari.logsearch.manager;
import java.util.List;
-import org.apache.ambari.logsearch.conf.global.LogSearchConfigState;
import org.apache.ambari.logsearch.configurer.LogSearchConfigConfigurer;
import org.apache.log4j.Logger;
@@ -34,9 +33,6 @@ import javax.ws.rs.core.Response;
public class ShipperConfigManager extends JsonManagerBase {
private static final Logger logger = Logger.getLogger(ShipperConfigManager.class);
-
- @Inject
- private LogSearchConfigState logSearchConfigState;
@Inject
private LogSearchConfigConfigurer logSearchConfigConfigurer;
@@ -47,29 +43,14 @@ public class ShipperConfigManager extends JsonManagerBase {
}
public List<String> getServices(String clusterName) {
- if (!logSearchConfigState.isLogSearchConfigAvailable()) {
- logger.warn("Log Search Config not available yet");
- return null;
- }
-
return LogSearchConfigConfigurer.getConfig().getServices(clusterName);
}
public String getInputConfig(String clusterName, String serviceName) {
- if (!logSearchConfigState.isLogSearchConfigAvailable()) {
- logger.warn("Log Search Config not available yet");
- return null;
- }
-
return LogSearchConfigConfigurer.getConfig().getInputConfig(clusterName, serviceName);
}
public Response setInputConfig(String clusterName, String serviceName, String inputConfig) {
- if (!logSearchConfigState.isLogSearchConfigAvailable()) {
- logger.warn("Log Search Config not available yet");
- return Response.serverError().build();
- }
-
try {
LogSearchConfigConfigurer.getConfig().setInputConfig(clusterName, serviceName, inputConfig);
return Response.ok().build();
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/ShipperConfigResource.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/ShipperConfigResource.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/ShipperConfigResource.java
index 38821bc..47e6ba2 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/ShipperConfigResource.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/ShipperConfigResource.java
@@ -55,7 +55,7 @@ public class ShipperConfigResource {
}
@GET
- @Path("/input/{clusterName}/{serviceName}")
+ @Path("/input/{clusterName}/services/{serviceName}")
@Produces({"application/json"})
@ApiOperation(GET_SHIPPER_CONFIG)
public String getShipperConfig(@PathParam("clusterName") String clusterName, @PathParam("serviceName") String serviceName) {
@@ -63,7 +63,7 @@ public class ShipperConfigResource {
}
@PUT
- @Path("/input/{clusterName}/{serviceName}")
+ @Path("/input/{clusterName}/services/{serviceName}")
@Produces("text/plain")
@ApiOperation(SET_SHIPPER_CONFIG)
public Response setShipperConfig(String body, @PathParam("clusterName") String clusterName, @PathParam("serviceName")
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/web/filters/LogSearchConfigStateFilter.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/web/filters/LogSearchConfigStateFilter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/web/filters/LogSearchConfigStateFilter.java
new file mode 100644
index 0000000..9b6cdfe
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/web/filters/LogSearchConfigStateFilter.java
@@ -0,0 +1,102 @@
+/*
+ * 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.web.filters;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.ambari.logsearch.common.MessageEnums;
+import org.apache.ambari.logsearch.common.VResponse;
+import org.apache.ambari.logsearch.conf.global.LogSearchConfigState;
+import org.apache.ambari.logsearch.util.RESTErrorUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.web.util.matcher.RequestMatcher;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Filter to decide whether the server us ready to serve requests which require Log Search configuration available.
+ */
+public class LogSearchConfigStateFilter implements Filter {
+ private static final Logger LOG = LoggerFactory.getLogger(LogSearchConfigStateFilter.class);
+
+ private static final String CONFIG_NOT_AVAILABLE = "Configuration is not available";
+
+ private final RequestMatcher requestMatcher;
+ private final LogSearchConfigState logSearchConfigState;
+
+ public LogSearchConfigStateFilter(RequestMatcher requestMatcher, LogSearchConfigState logSearchConfigState) {
+ this.requestMatcher = requestMatcher;
+ this.logSearchConfigState = logSearchConfigState;
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+ throws IOException, ServletException {
+ HttpServletRequest request = (HttpServletRequest) servletRequest;
+ if (requestMatcher.matches(request)) {
+ VResponse errorResponse = getErrorResponse();
+ if (errorResponse != null) {
+ LOG.info("{} request is filtered out: {}", request.getRequestURL(), errorResponse.getMsgDesc());
+ HttpServletResponse resp = (HttpServletResponse) servletResponse;
+ resp.setStatus(500);
+ resp.setContentType("application/json");
+ resp.getWriter().print(createStringFromErrorMessageObject(errorResponse));
+ return;
+ }
+ }
+
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+
+ private VResponse getErrorResponse() {
+ if (!logSearchConfigState.isLogSearchConfigAvailable()) {
+ return RESTErrorUtil.createMessageResponse(CONFIG_NOT_AVAILABLE, MessageEnums.CONFIGURATION_NOT_AVAILABLE);
+ }
+
+ return null;
+ }
+
+ private String createStringFromErrorMessageObject(VResponse responseObject) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ return mapper.writeValueAsString(responseObject);
+ } catch (Exception e) {
+ throw RESTErrorUtil.createRESTException("Cannot parse response object on backend", MessageEnums.ERROR_CREATING_OBJECT);
+ }
+ }
+
+ @Override
+ public void destroy() {
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/logsearch_config_aggregator.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/logsearch_config_aggregator.py b/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/logsearch_config_aggregator.py
deleted file mode 100644
index c14900e..0000000
--- a/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/logsearch_config_aggregator.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""
-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.
-
-"""
-from resource_management import Logger
-
-def __parse_component_mappings(component_mappings):
- components = list()
- component_mappings_list = component_mappings.split(';')
- if component_mappings_list and len(component_mappings_list) > 0:
- metadata_list = map(lambda x : x.split(':'), component_mappings_list)
- if metadata_list and len(metadata_list) > 0:
- for metadata in metadata_list:
- if (len(metadata) == 2):
- logids = metadata[1].split(',')
- components.extend(logids)
- Logger.info("Found logids for logsearch component %s - (%s) " % (metadata[0], metadata[1]))
- return components
-
-def get_logsearch_meta_configs(configurations):
- logsearch_meta_configs = {}
- for key, value in configurations.iteritems(): # iter on both keys and values
- if str(key).endswith('logsearch-conf'):
- logsearch_meta_configs[key] = value
- Logger.info("Found logsearch config entry : " + key)
- return logsearch_meta_configs
-
-def get_logfeeder_metadata(logsearch_meta_configs):
- """
- get logfeeder pattern metadata list, an element: (e.g.) :
- ['service_config_name' : 'pattern json content']
- """
- logfeeder_contents = {}
- for key, value in logsearch_meta_configs.iteritems():
- if 'content' in logsearch_meta_configs[key] and logsearch_meta_configs[key]['content'].strip():
- logfeeder_contents[key] = logsearch_meta_configs[key]['content']
- Logger.info("Found logfeeder pattern content in " + key)
- return logfeeder_contents
-
-def get_logsearch_metadata(logsearch_meta_configs):
- """
- get logsearch metadata list, an element (e.g.) :
- ['service_name_key' : {component1 : [logid1, logid2]}, {component2 : [logid1, logid2]}]
- """
- logsearch_service_component_mappings = {}
- for key, value in logsearch_meta_configs.iteritems():
- if 'service_name' in logsearch_meta_configs[key] and 'component_mappings' in logsearch_meta_configs[key]:
- service_name = logsearch_meta_configs[key]['service_name']
- component_mappings = __parse_component_mappings(logsearch_meta_configs[key]['component_mappings'])
- if service_name.strip() and component_mappings:
- logsearch_service_component_mappings[service_name] = component_mappings
- if 'service_component_mappings' in logsearch_meta_configs[key]:
- service_component_mappings = logsearch_meta_configs[key]['service_component_mappings']
- if service_component_mappings.strip():
- for service_component_mapping in service_component_mappings.split('|'):
- tokens = service_component_mapping.split('=')
- service_name = tokens[0]
- component_mappings = __parse_component_mappings(tokens[1])
- if service_name.strip() and component_mappings:
- logsearch_service_component_mappings[service_name] = component_mappings
-
- return logsearch_service_component_mappings
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/e8e997a3/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py b/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
index bfe0c0d..6738c5c 100644
--- a/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
+++ b/ambari-server/src/main/resources/common-services/LOGSEARCH/0.5.0/package/scripts/params.py
@@ -21,7 +21,6 @@ limitations under the License.
import os
from ambari_commons.constants import AMBARI_SUDO_BINARY
-from logsearch_config_aggregator import get_logfeeder_metadata, get_logsearch_metadata, get_logsearch_meta_configs
from resource_management.libraries.functions.default import default
from resource_management.libraries.functions.format import format
from resource_management.libraries.functions.is_empty import is_empty
@@ -79,8 +78,6 @@ java64_home = config['hostLevelParams']['java_home']
cluster_name = str(config['clusterName'])
configurations = config['configurations'] # need reference inside logfeeder jinja templates
-logserch_meta_configs = get_logsearch_meta_configs(configurations)
-logsearch_metadata = get_logsearch_metadata(logserch_meta_configs)
# for now just pick first collector
if 'metrics_collector_hosts' in config['clusterHostInfo']: