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/05/29 10:07:10 UTC

ambari git commit: AMBARI-21119 Log Search REST API validate input configurations and log level filters (mgergely)

Repository: ambari
Updated Branches:
  refs/heads/trunk 9f5f7656c -> 93130e6bf


AMBARI-21119 Log Search REST API validate input configurations and log level filters (mgergely)

Change-Id: I9e09a73c60ad76fd51218742d1ebf18f42afbc62


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/93130e6b
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/93130e6b
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/93130e6b

Branch: refs/heads/trunk
Commit: 93130e6bf83dc656ecb486a8f5fbabcb97a694f1
Parents: 9f5f765
Author: Miklos Gergely <mg...@hortonworks.com>
Authored: Mon May 29 12:06:25 2017 +0200
Committer: Miklos Gergely <mg...@hortonworks.com>
Committed: Mon May 29 12:07:01 2017 +0200

----------------------------------------------------------------------
 .../impl/MapFieldNameDescriptorImpl.java        |  4 +-
 .../logsearch/manager/ShipperConfigManager.java | 10 +--
 .../model/common/LSServerConditions.java        |  7 ++
 .../logsearch/model/common/LSServerFields.java  |  6 ++
 .../logsearch/model/common/LSServerFilter.java  | 26 ++++---
 .../common/LSServerFilterDeserializer.java      | 60 +++++++++++++++
 .../model/common/LSServerFilterGrok.java        |  6 ++
 .../model/common/LSServerFilterJson.java        |  2 +
 .../model/common/LSServerFilterKeyValue.java    |  2 +
 .../logsearch/model/common/LSServerInput.java   | 37 +++++----
 .../model/common/LSServerInputConfig.java       | 13 ++++
 .../model/common/LSServerInputDeserializer.java | 62 +++++++++++++++
 .../model/common/LSServerInputFile.java         |  2 +
 .../model/common/LSServerInputFileBase.java     |  2 +
 .../model/common/LSServerInputS3File.java       |  6 ++
 .../model/common/LSServerLogLevelFilter.java    | 24 ++++--
 .../model/common/LSServerLogLevelFilterMap.java |  5 ++
 .../logsearch/model/common/LSServerMapDate.java |  5 ++
 .../model/common/LSServerMapFieldCopy.java      |  5 ++
 .../model/common/LSServerMapFieldName.java      |  5 ++
 .../model/common/LSServerMapFieldValue.java     |  6 ++
 .../model/common/LSServerPostMapValues.java     | 34 ++++++---
 .../model/common/LSServerPostMapValuesList.java | 59 +++++++++++++++
 .../LSServerPostMapValuesListDeserializer.java  | 79 ++++++++++++++++++++
 .../LSServerPostMapValuesListSerializer.java    | 44 +++++++++++
 .../common/LSServerPostMapValuesSerializer.java | 39 ----------
 .../logsearch/rest/ShipperConfigResource.java   | 19 +++--
 27 files changed, 474 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-config-zookeeper/src/main/java/org/apache/ambari/logsearch/config/zookeeper/model/inputconfig/impl/MapFieldNameDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-config-zookeeper/src/main/java/org/apache/ambari/logsearch/config/zookeeper/model/inputconfig/impl/MapFieldNameDescriptorImpl.java b/ambari-logsearch/ambari-logsearch-config-zookeeper/src/main/java/org/apache/ambari/logsearch/config/zookeeper/model/inputconfig/impl/MapFieldNameDescriptorImpl.java
index 333cb67..e5676b0 100644
--- a/ambari-logsearch/ambari-logsearch-config-zookeeper/src/main/java/org/apache/ambari/logsearch/config/zookeeper/model/inputconfig/impl/MapFieldNameDescriptorImpl.java
+++ b/ambari-logsearch/ambari-logsearch-config-zookeeper/src/main/java/org/apache/ambari/logsearch/config/zookeeper/model/inputconfig/impl/MapFieldNameDescriptorImpl.java
@@ -27,11 +27,11 @@ import com.google.gson.annotations.SerializedName;
 public class MapFieldNameDescriptorImpl implements MapFieldNameDescriptor {
   @Override
   public String getJsonName() {
-    return "map_fieldname";
+    return "map_field_name";
   }
 
   @Expose
-  @SerializedName("new_fieldname")
+  @SerializedName("new_field_name")
   private String newFieldName;
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/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 44d91a9..a0db92f 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
@@ -27,6 +27,7 @@ import org.apache.ambari.logsearch.model.common.LSServerInputConfig;
 import org.apache.ambari.logsearch.model.common.LSServerLogLevelFilterMap;
 import org.apache.log4j.Logger;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
 
 import javax.annotation.PostConstruct;
@@ -57,8 +58,7 @@ public class ShipperConfigManager extends JsonManagerBase {
     return new LSServerInputConfig(inputConfig);
   }
 
-  public Response createInputConfig(String clusterName, String serviceName, String inputConfig) {
-    
+  public Response createInputConfig(String clusterName, String serviceName, LSServerInputConfig inputConfig) {
     try {
       if (LogSearchConfigConfigurer.getConfig().inputConfigExists(clusterName, serviceName)) {
         return Response.serverError()
@@ -67,7 +67,7 @@ public class ShipperConfigManager extends JsonManagerBase {
             .build();
       }
       
-      LogSearchConfigConfigurer.getConfig().createInputConfig(clusterName, serviceName, inputConfig);
+      LogSearchConfigConfigurer.getConfig().createInputConfig(clusterName, serviceName, new ObjectMapper().writeValueAsString(inputConfig));
       return Response.ok().build();
     } catch (Exception e) {
       logger.warn("Could not create input config", e);
@@ -75,7 +75,7 @@ public class ShipperConfigManager extends JsonManagerBase {
     }
   }
 
-  public Response setInputConfig(String clusterName, String serviceName, String inputConfig) {
+  public Response setInputConfig(String clusterName, String serviceName, LSServerInputConfig inputConfig) {
     try {
       if (!LogSearchConfigConfigurer.getConfig().inputConfigExists(clusterName, serviceName)) {
         return Response.serverError()
@@ -84,7 +84,7 @@ public class ShipperConfigManager extends JsonManagerBase {
             .build();
       }
       
-      LogSearchConfigConfigurer.getConfig().setInputConfig(clusterName, serviceName, inputConfig);
+      LogSearchConfigConfigurer.getConfig().setInputConfig(clusterName, serviceName, new ObjectMapper().writeValueAsString(inputConfig));
       return Response.ok().build();
     } catch (Exception e) {
       logger.warn("Could not update input config", e);

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerConditions.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerConditions.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerConditions.java
index 9cd9710..11c4f70 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerConditions.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerConditions.java
@@ -19,14 +19,21 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.Conditions;
 
 import io.swagger.annotations.ApiModel;
 
 @ApiModel
 public class LSServerConditions {
+  @Valid
+  @NotNull
   private LSServerFields fields;
   
+  public LSServerConditions() {}
+  
   public LSServerConditions(Conditions conditions) {
     this.fields = new LSServerFields(conditions.getFields());
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFields.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFields.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFields.java
index 5f570da..dcaadb6 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFields.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFields.java
@@ -21,14 +21,20 @@ package org.apache.ambari.logsearch.model.common;
 
 import java.util.Set;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.Fields;
 
 import io.swagger.annotations.ApiModel;
 
 @ApiModel
 public class LSServerFields {
+  @NotNull
   private Set<String> type;
   
+  public LSServerFields() {
+  }
+  
   public LSServerFields(Fields fields) {
     this.type = fields.getType();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilter.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilter.java
index 0190c01..d99a77d 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilter.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilter.java
@@ -19,11 +19,13 @@
 
 package org.apache.ambari.logsearch.model.common;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.PostMapValues;
 
@@ -36,8 +38,11 @@ import io.swagger.annotations.ApiModel;
 @ApiModel
 @JsonInclude(Include.NON_NULL)
 public abstract class LSServerFilter {
+  @NotNull
   private String filter;
   
+  @Valid
+  @NotNull
   private LSServerConditions conditions;
   
   @JsonProperty("sort_order")
@@ -48,10 +53,14 @@ public abstract class LSServerFilter {
   @JsonProperty("remove_source_field")
   private Boolean removeSourceField;
   
-  private Map<String, List<LSServerPostMapValues>> postMapValues;
+  @Valid
+  @JsonProperty("post_map_values")
+  private Map<String, LSServerPostMapValuesList> postMapValues;
   
   @JsonProperty("is_enabled")
   private Boolean isEnabled;
+  
+  public LSServerFilter() {}
 
   public LSServerFilter(FilterDescriptor filterDescriptor) {
     this.filter = filterDescriptor.getFilter();
@@ -60,13 +69,10 @@ public abstract class LSServerFilter {
     this.sourceField = filterDescriptor.getSourceField();
     this.removeSourceField = filterDescriptor.isRemoveSourceField();
     
-    postMapValues = new HashMap<String, List<LSServerPostMapValues>>();
+    this.postMapValues = new HashMap<String, LSServerPostMapValuesList>();
     for (Map.Entry<String, ? extends List<? extends PostMapValues>> e : filterDescriptor.getPostMapValues().entrySet()) {
-      List<LSServerPostMapValues> lsServerPostMapValues = new ArrayList<>();
-      for (PostMapValues pmv : e.getValue()) {
-        lsServerPostMapValues.add(new LSServerPostMapValues(pmv));
-      }
-      postMapValues.put(e.getKey(), lsServerPostMapValues);
+      LSServerPostMapValuesList lsServerPostMapValuesList = new LSServerPostMapValuesList(e.getValue());
+      postMapValues.put(e.getKey(), lsServerPostMapValuesList);
     }
     
     this.isEnabled = filterDescriptor.isEnabled();
@@ -112,11 +118,11 @@ public abstract class LSServerFilter {
     this.removeSourceField = removeSourceField;
   }
 
-  public Map<String, List<LSServerPostMapValues>> getPostMapValues() {
+  public Map<String, LSServerPostMapValuesList> getPostMapValues() {
     return postMapValues;
   }
 
-  public void setPostMapValues(Map<String, List<LSServerPostMapValues>> postMapValues) {
+  public void setPostMapValues(Map<String, LSServerPostMapValuesList> postMapValues) {
     this.postMapValues = postMapValues;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterDeserializer.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterDeserializer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterDeserializer.java
new file mode 100644
index 0000000..df3998f
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterDeserializer.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.model.common;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class LSServerFilterDeserializer extends JsonDeserializer<List<LSServerFilter>> {
+  @Override
+  public List<LSServerFilter> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+    ObjectCodec oc = jp.getCodec();
+    JsonNode node = oc.readTree(jp);
+    
+    List<LSServerFilter> filters = new ArrayList<>();
+    for (JsonNode filterNode : node) {
+      if (filterNode.get("filter") == null) {
+        throw new IllegalArgumentException("Each filter element must have a field called 'filter' declaring it's type");
+      }
+      switch (filterNode.get("filter").asText()) {
+        case "grok" :
+          filters.add(oc.treeToValue((TreeNode)filterNode, LSServerFilterGrok.class));
+          break;
+        case "keyvalue" :
+          filters.add(oc.treeToValue((TreeNode)filterNode, LSServerFilterKeyValue.class));
+          break;
+        case "json" :
+          filters.add(oc.treeToValue((TreeNode)filterNode, LSServerFilterJson.class));
+          break;
+      }
+    }
+    
+    return filters;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterGrok.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterGrok.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterGrok.java
index a8c4a7a..6de9f4c 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterGrok.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterGrok.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterGrokDescriptor;
 
@@ -31,12 +33,16 @@ public class LSServerFilterGrok extends LSServerFilter {
   @JsonProperty("log4j_format")
   private String log4jFormat;
 
+  @NotNull
   @JsonProperty("multiline_pattern")
   private String multilinePattern;
 
+  @NotNull
   @JsonProperty("message_pattern")
   private String messagePattern;
 
+  public LSServerFilterGrok() {}
+
   public LSServerFilterGrok(FilterDescriptor filterDescriptor) {
     super(filterDescriptor);
     if (filterDescriptor instanceof FilterGrokDescriptor) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterJson.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterJson.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterJson.java
index 3c0ed17..d20f842 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterJson.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterJson.java
@@ -25,6 +25,8 @@ import io.swagger.annotations.ApiModel;
 
 @ApiModel
 public class LSServerFilterJson extends LSServerFilter {
+  public LSServerFilterJson() {}
+  
   public LSServerFilterJson(FilterDescriptor filterDescriptor) {
     super(filterDescriptor);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterKeyValue.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterKeyValue.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterKeyValue.java
index dcee25d..a879bb8 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterKeyValue.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerFilterKeyValue.java
@@ -37,6 +37,8 @@ public class LSServerFilterKeyValue extends LSServerFilter {
   @JsonProperty("value_borders")
   private String valueBorders;
 
+  public LSServerFilterKeyValue() {}
+
   public LSServerFilterKeyValue(FilterDescriptor filterDescriptor) {
     super(filterDescriptor);
     FilterKeyValueDescriptor filterKeyValueDescriptor = (FilterKeyValueDescriptor)filterDescriptor;

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInput.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInput.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInput.java
index fe83fe4..e0f7564 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInput.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInput.java
@@ -21,6 +21,8 @@ package org.apache.ambari.logsearch.model.common;
 
 import java.util.Map;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.InputDescriptor;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -32,42 +34,47 @@ import io.swagger.annotations.ApiModel;
 @ApiModel
 @JsonInclude(Include.NON_NULL)
 public abstract class LSServerInput {
-  private final String type;
-  private final String rowtype;
-  private final String path;
+  @NotNull
+  private String type;
+  private String rowtype;
+  
+  @NotNull
+  private String path;
   
   @JsonProperty("add_fields")
-  private final Map<String, String> addFields;
+  private Map<String, String> addFields;
   
-  private final String source;
-  private final Boolean tail;
+  private String source;
+  private Boolean tail;
   
   @JsonProperty("gen_event_md5")
-  private final Boolean genEventMd5;
+  private Boolean genEventMd5;
   
   @JsonProperty("use_event_md5_as_id")
-  private final Boolean useEventMd5AsId;
+  private Boolean useEventMd5AsId;
   
   @JsonProperty("start_position")
-  private final String startPosition;
+  private String startPosition;
   
   @JsonProperty("cache_enabled")
-  private final Boolean cacheEnabled;
+  private Boolean cacheEnabled;
   
   @JsonProperty("cache_key_field")
-  private final String cacheKeyField;
+  private String cacheKeyField;
   
   @JsonProperty("cache_last_dedup_enabled")
-  private final Boolean cacheLastDedupEnabled;
+  private Boolean cacheLastDedupEnabled;
   
   @JsonProperty("cache_size")
-  private final Integer cacheSize;
+  private Integer cacheSize;
   
   @JsonProperty("cache_dedup_interval")
-  private final Long cacheDedupInterval;
+  private Long cacheDedupInterval;
   
   @JsonProperty("is_enabled")
-  private final Boolean isEnabled;
+  private Boolean isEnabled;
+  
+  public LSServerInput() {}
   
   public LSServerInput(InputDescriptor inputDescriptor) {
     this.type = inputDescriptor.getType();

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputConfig.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputConfig.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputConfig.java
index e3dc0d1..81c4593 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputConfig.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputConfig.java
@@ -22,6 +22,9 @@ package org.apache.ambari.logsearch.model.common;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterGrokDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.FilterJsonDescriptor;
@@ -31,17 +34,27 @@ import org.apache.ambari.logsearch.config.api.model.inputconfig.InputDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.InputFileBaseDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.InputS3FileDescriptor;
 
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 @ApiModel
 public class LSServerInputConfig {
+  @Valid
+  @NotNull
   @ApiModelProperty
+  @JsonDeserialize(using = LSServerInputDeserializer.class)
   private List<LSServerInput> input;
   
+  @Valid
+  @NotNull
   @ApiModelProperty
+  @JsonDeserialize(using = LSServerFilterDeserializer.class)
   private List<LSServerFilter> filter;
   
+  public LSServerInputConfig() {}
+  
   public LSServerInputConfig(InputConfig inputConfig) {
     input = new ArrayList<>();
     for (InputDescriptor inputDescriptor : inputConfig.getInput()) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputDeserializer.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputDeserializer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputDeserializer.java
new file mode 100644
index 0000000..63a8627
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputDeserializer.java
@@ -0,0 +1,62 @@
+/*
+ * 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.model.common;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class LSServerInputDeserializer extends JsonDeserializer<List<LSServerInput>> {
+  @Override
+  public List<LSServerInput> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+    ObjectCodec oc = jp.getCodec();
+    JsonNode node = oc.readTree(jp);
+    
+    List<LSServerInput> inputs = new ArrayList<>();
+    for (JsonNode inputNode : node) {
+    
+      String source = null;
+      if (inputNode.get("source") != null) {
+        source = inputNode.get("source").asText();
+      } else {
+        source = (inputNode.get("s3_access_key") != null || inputNode.get("s3_secret_key") != null) ? "s3_file" : "file";
+      }
+      
+      switch (source) {
+        case "file" :
+          inputs.add(oc.treeToValue((TreeNode)inputNode, LSServerInputFile.class));
+          break;
+        case "s3_file" :
+          inputs.add(oc.treeToValue((TreeNode)inputNode, LSServerInputS3File.class));
+          break;
+      }
+    }
+    
+    return inputs;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFile.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFile.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFile.java
index 5c547ad..bb2a49c 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFile.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFile.java
@@ -25,6 +25,8 @@ import io.swagger.annotations.ApiModel;
 
 @ApiModel
 public class LSServerInputFile extends LSServerInputFileBase {
+  public LSServerInputFile() {}
+
   public LSServerInputFile(InputDescriptor inputDescriptor) {
     super(inputDescriptor);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFileBase.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFileBase.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFileBase.java
index df21d0d..429d50a 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFileBase.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputFileBase.java
@@ -37,6 +37,8 @@ public abstract class LSServerInputFileBase extends LSServerInput {
   @JsonProperty("copy_file")
   private Boolean copyFile;
   
+  public LSServerInputFileBase() {}
+  
   public LSServerInputFileBase(InputDescriptor inputDescriptor) {
     super(inputDescriptor);
     

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputS3File.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputS3File.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputS3File.java
index 8e9acf0..24d25c4 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputS3File.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerInputS3File.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.InputDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.InputS3FileDescriptor;
 
@@ -28,12 +30,16 @@ import io.swagger.annotations.ApiModel;
 
 @ApiModel
 public class LSServerInputS3File extends LSServerInputFileBase {
+  @NotNull
   @JsonProperty("s3_access_key")
   private String s3AccessKey;
   
+  @NotNull
   @JsonProperty("s3_secret_key")
   private String s3SecretKey;
   
+  public LSServerInputS3File() {}
+  
   public LSServerInputS3File(InputDescriptor inputDescriptor) {
     super(inputDescriptor);
     InputS3FileDescriptor inputS3FileDescriptor = (InputS3FileDescriptor)inputDescriptor;

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilter.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilter.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilter.java
index 2a00802..f79fafa 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilter.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilter.java
@@ -22,6 +22,8 @@ package org.apache.ambari.logsearch.model.common;
 import java.util.Date;
 import java.util.List;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.loglevelfilter.LogLevelFilter;
 
 import io.swagger.annotations.ApiModel;
@@ -30,11 +32,23 @@ import io.swagger.annotations.ApiModelProperty;
 @ApiModel
 public class LSServerLogLevelFilter {
 
-  @ApiModelProperty private String label;
-  @ApiModelProperty private List<String> hosts;
-  @ApiModelProperty private List<String> defaultLevels;
-  @ApiModelProperty private List<String> overrideLevels;
-  @ApiModelProperty private Date expiryTime;
+  @NotNull
+  @ApiModelProperty
+  private String label;
+  
+  @NotNull
+  @ApiModelProperty
+  private List<String> hosts;
+  
+  @NotNull
+  @ApiModelProperty
+  private List<String> defaultLevels;
+  
+  @ApiModelProperty
+  private List<String> overrideLevels;
+  
+  @ApiModelProperty
+  private Date expiryTime;
 
   public LSServerLogLevelFilter() {}
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilterMap.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilterMap.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilterMap.java
index 3088db1..8081a27 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilterMap.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerLogLevelFilterMap.java
@@ -22,6 +22,9 @@ package org.apache.ambari.logsearch.model.common;
 import java.util.Map;
 import java.util.TreeMap;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.loglevelfilter.LogLevelFilter;
 import org.apache.ambari.logsearch.config.api.model.loglevelfilter.LogLevelFilterMap;
 
@@ -31,6 +34,8 @@ import io.swagger.annotations.ApiModelProperty;
 @ApiModel
 public class LSServerLogLevelFilterMap {
 
+  @Valid
+  @NotNull
   @ApiModelProperty
   private TreeMap<String, LSServerLogLevelFilter> filter;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapDate.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapDate.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapDate.java
index dcacceb..3147402 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapDate.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapDate.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapDateDescriptor;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -35,9 +37,12 @@ public class LSServerMapDate extends LSServerMapField {
   @JsonProperty("source_date_pattern")
   private String sourceDatePattern;
 
+  @NotNull
   @JsonProperty("target_date_pattern")
   private String targetDatePattern;
 
+  public LSServerMapDate() {}
+
   public LSServerMapDate(MapDateDescriptor mapDateDescriptor) {
     this.sourceDatePattern = mapDateDescriptor.getSourceDatePattern();
     this.targetDatePattern = mapDateDescriptor.getTargetDatePattern();

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldCopy.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldCopy.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldCopy.java
index b0bea83..ab12698 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldCopy.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldCopy.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldCopyDescriptor;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,9 +34,12 @@ public class LSServerMapFieldCopy extends LSServerMapField {
     return "map_fieldcopy";
   }
 
+  @NotNull
   @JsonProperty("copy_name")
   private String copyName;
 
+  public LSServerMapFieldCopy() {}
+
   public LSServerMapFieldCopy(MapFieldCopyDescriptor mapFieldCopyDescriptor) {
     this.copyName = mapFieldCopyDescriptor.getCopyName();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldName.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldName.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldName.java
index 000b29d..ab7311c 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldName.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldName.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldNameDescriptor;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,9 +34,12 @@ public class LSServerMapFieldName extends LSServerMapField {
     return "map_fieldname";
   }
 
+  @NotNull
   @JsonProperty("new_field_name")
   private String newFieldName;
 
+  public LSServerMapFieldName() {}
+
   public LSServerMapFieldName(MapFieldNameDescriptor mapFieldNameDescriptor) {
     this.newFieldName = mapFieldNameDescriptor.getNewFieldName();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldValue.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldValue.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldValue.java
index 6152de5..a7d3949 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldValue.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerMapFieldValue.java
@@ -19,6 +19,8 @@
 
 package org.apache.ambari.logsearch.model.common;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldValueDescriptor;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -32,12 +34,16 @@ public class LSServerMapFieldValue extends LSServerMapField {
     return "map_fieldvalue";
   }
 
+  @NotNull
   @JsonProperty("pre_value")
   private String preValue;
 
+  @NotNull
   @JsonProperty("post_value")
   private String postValue;
 
+  public LSServerMapFieldValue() {}
+
   public LSServerMapFieldValue(MapFieldValueDescriptor mapFieldValueDescriptor) {
     this.preValue = mapFieldValueDescriptor.getPreValue();
     this.postValue = mapFieldValueDescriptor.getPostValue();

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValues.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValues.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValues.java
index 5f361c9..c62a9fd 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValues.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValues.java
@@ -22,6 +22,9 @@ package org.apache.ambari.logsearch.model.common;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapDateDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldCopyDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldDescriptor;
@@ -29,30 +32,37 @@ import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldNameDesc
 import org.apache.ambari.logsearch.config.api.model.inputconfig.MapFieldValueDescriptor;
 import org.apache.ambari.logsearch.config.api.model.inputconfig.PostMapValues;
 
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
 import io.swagger.annotations.ApiModel;
 
 @ApiModel
-@JsonSerialize(using = LSServerPostMapValuesSerializer.class)
 public class LSServerPostMapValues {
+  @Valid
+  @NotNull
   private List<LSServerMapField> mappers;
   
+  public LSServerPostMapValues() {}
+  
   public LSServerPostMapValues(PostMapValues pmv) {
     mappers = new ArrayList<>();
     for (MapFieldDescriptor mapFieldDescriptor : pmv.getMappers()) {
-      if (mapFieldDescriptor instanceof MapDateDescriptor) {
-        mappers.add(new LSServerMapDate((MapDateDescriptor)mapFieldDescriptor));
-      } else if (mapFieldDescriptor instanceof MapFieldCopyDescriptor) {
-        mappers.add(new LSServerMapFieldCopy((MapFieldCopyDescriptor)mapFieldDescriptor));
-      } else if (mapFieldDescriptor instanceof MapFieldNameDescriptor) {
-        mappers.add(new LSServerMapFieldName((MapFieldNameDescriptor)mapFieldDescriptor));
-      } else if (mapFieldDescriptor instanceof MapFieldValueDescriptor) {
-        mappers.add(new LSServerMapFieldValue((MapFieldValueDescriptor)mapFieldDescriptor));
-      }
+      mappers.add(convert(mapFieldDescriptor));
     }
   }
 
+  private LSServerMapField convert(MapFieldDescriptor mapFieldDescriptor) {
+    if (mapFieldDescriptor instanceof MapDateDescriptor) {
+      return new LSServerMapDate((MapDateDescriptor)mapFieldDescriptor);
+    } else if (mapFieldDescriptor instanceof MapFieldCopyDescriptor) {
+      return new LSServerMapFieldCopy((MapFieldCopyDescriptor)mapFieldDescriptor);
+    } else if (mapFieldDescriptor instanceof MapFieldNameDescriptor) {
+      return new LSServerMapFieldName((MapFieldNameDescriptor)mapFieldDescriptor);
+    } else if (mapFieldDescriptor instanceof MapFieldValueDescriptor) {
+      return new LSServerMapFieldValue((MapFieldValueDescriptor)mapFieldDescriptor);
+    }
+    
+    throw new IllegalArgumentException("Unknown mapper: " + mapFieldDescriptor.getClass());
+  }
+  
   public List<LSServerMapField> getMappers() {
     return mappers;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesList.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesList.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesList.java
new file mode 100644
index 0000000..2d29de0
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesList.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.model.common;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+
+import org.apache.ambari.logsearch.config.api.model.inputconfig.PostMapValues;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import io.swagger.annotations.ApiModel;
+
+@ApiModel
+@JsonSerialize(using = LSServerPostMapValuesListSerializer.class)
+@JsonDeserialize(using = LSServerPostMapValuesListDeserializer.class)
+public class LSServerPostMapValuesList {
+  @Valid
+  @NotNull
+  private List<LSServerPostMapValues> mapperLists;
+  
+  public LSServerPostMapValuesList() {}
+  
+  public LSServerPostMapValuesList(List<? extends PostMapValues> list) {
+    mapperLists = new ArrayList<>();
+    for (PostMapValues postMapValues : list) {
+      mapperLists.add(new LSServerPostMapValues(postMapValues));
+    }
+  }
+  
+  public List<LSServerPostMapValues> getMappersList() {
+    return mapperLists;
+  }
+
+  public void setMappersList(List<LSServerPostMapValues> mapperLists) {
+    this.mapperLists = mapperLists;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListDeserializer.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListDeserializer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListDeserializer.java
new file mode 100644
index 0000000..18744e2
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListDeserializer.java
@@ -0,0 +1,79 @@
+/*
+ * 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.model.common;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class LSServerPostMapValuesListDeserializer extends JsonDeserializer<LSServerPostMapValuesList> {
+  @Override
+  public LSServerPostMapValuesList deserialize(JsonParser jp, DeserializationContext ctxt)
+      throws IOException, JsonProcessingException {
+    ObjectCodec oc = jp.getCodec();
+    JsonNode node = oc.readTree(jp);
+    
+    List<LSServerPostMapValues> mappersList = new ArrayList<>();
+    for (JsonNode childNode : node) {
+      List<LSServerMapField> mappers = new ArrayList<>();
+      for (Iterator<Map.Entry<String, JsonNode>> i = childNode.fields(); i.hasNext();) {
+        Map.Entry<String, JsonNode> mapperData = i.next();
+        String mapperType = mapperData.getKey();
+        JsonNode mapperProperties = mapperData.getValue();
+        switch (mapperType) {
+          case "map_date" :
+            LSServerMapDate mapDate = oc.treeToValue((TreeNode)mapperProperties, LSServerMapDate.class);
+            mappers.add(mapDate);
+            break;
+          case "map_fieldname" :
+            LSServerMapFieldName mapFieldName = oc.treeToValue((TreeNode)mapperProperties, LSServerMapFieldName.class);
+            mappers.add(mapFieldName);
+            break;
+          case "map_fieldvalue" :
+            LSServerMapFieldValue mapFieldValue = oc.treeToValue((TreeNode)mapperProperties, LSServerMapFieldValue.class);
+            mappers.add(mapFieldValue);
+            break;
+          case "map_fieldcopy" :
+            LSServerMapFieldCopy mapFieldCopy = oc.treeToValue((TreeNode)mapperProperties, LSServerMapFieldCopy.class);
+            mappers.add(mapFieldCopy);
+            break;
+        }
+      }
+      
+      LSServerPostMapValues lsServerPostMapValues = new LSServerPostMapValues();
+      lsServerPostMapValues.setMappers(mappers);
+      mappersList.add(lsServerPostMapValues);
+    }
+    
+    LSServerPostMapValuesList lsServerPostMapValuesList = new LSServerPostMapValuesList();
+    lsServerPostMapValuesList.setMappersList(mappersList);
+    return lsServerPostMapValuesList;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListSerializer.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListSerializer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListSerializer.java
new file mode 100644
index 0000000..bb1eadf
--- /dev/null
+++ b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesListSerializer.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.model.common;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class LSServerPostMapValuesListSerializer extends JsonSerializer<LSServerPostMapValuesList> {
+  @Override
+  public void serialize(LSServerPostMapValuesList value, JsonGenerator jgen, SerializerProvider provider)
+      throws IOException, JsonProcessingException {
+    jgen.writeStartArray();
+    for (LSServerPostMapValues postMapValues : value.getMappersList()) {
+      jgen.writeStartObject();
+      for (LSServerMapField mapField : postMapValues.getMappers()) {
+        jgen.writeObjectField(mapField.getName(), mapField);
+      }
+      jgen.writeEndObject();
+    }
+    
+    jgen.writeEndArray();
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesSerializer.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesSerializer.java b/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesSerializer.java
deleted file mode 100644
index 7543677..0000000
--- a/ambari-logsearch/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/common/LSServerPostMapValuesSerializer.java
+++ /dev/null
@@ -1,39 +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.
- */
-
-package org.apache.ambari.logsearch.model.common;
-
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-public class LSServerPostMapValuesSerializer extends JsonSerializer<LSServerPostMapValues> {
-  @Override
-  public void serialize(LSServerPostMapValues value, JsonGenerator jgen, SerializerProvider provider)
-      throws IOException, JsonProcessingException {
-    jgen.writeStartObject();
-    for (LSServerMapField mapField : value.getMappers()) {
-      jgen.writeObjectField(mapField.getName(), mapField);
-    }
-    jgen.writeEndObject();
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/93130e6b/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 a7d99c9..71da326 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
@@ -21,6 +21,8 @@ package org.apache.ambari.logsearch.rest;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.validation.Valid;
+import javax.validation.executable.ValidateOnExecution;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
@@ -75,18 +77,20 @@ public class ShipperConfigResource {
   @Path("/input/{clusterName}/services/{serviceName}")
   @Produces({"application/json"})
   @ApiOperation(SET_SHIPPER_CONFIG_OD)
-  public Response createShipperConfig(String body, @PathParam("clusterName") String clusterName, @PathParam("serviceName")
-    String serviceName) {
-    return shipperConfigManager.createInputConfig(clusterName, serviceName, body);
+  @ValidateOnExecution
+  public Response createShipperConfig(@Valid LSServerInputConfig request, @PathParam("clusterName") String clusterName,
+      @PathParam("serviceName") String serviceName) {
+    return shipperConfigManager.createInputConfig(clusterName, serviceName, request);
   }
 
   @PUT
   @Path("/input/{clusterName}/services/{serviceName}")
   @Produces({"application/json"})
   @ApiOperation(SET_SHIPPER_CONFIG_OD)
-  public Response setShipperConfig(String body, @PathParam("clusterName") String clusterName, @PathParam("serviceName")
-    String serviceName) {
-    return shipperConfigManager.setInputConfig(clusterName, serviceName, body);
+  @ValidateOnExecution
+  public Response setShipperConfig(@Valid LSServerInputConfig request, @PathParam("clusterName") String clusterName,
+      @PathParam("serviceName") String serviceName) {
+    return shipperConfigManager.setInputConfig(clusterName, serviceName, request);
   }
 
   @GET
@@ -101,7 +105,8 @@ public class ShipperConfigResource {
   @Path("/filters/{clusterName}/level")
   @Produces({"application/json"})
   @ApiOperation(UPDATE_LOG_LEVEL_FILTER_OD)
-  public Response setLogLevelFilter(LSServerLogLevelFilterMap request, @PathParam("clusterName") String clusterName) {
+  @ValidateOnExecution
+  public Response setLogLevelFilter(@Valid LSServerLogLevelFilterMap request, @PathParam("clusterName") String clusterName) {
     return shipperConfigManager.setLogLevelFilters(clusterName, request);
   }