You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gobblin.apache.org by ab...@apache.org on 2017/07/31 07:53:20 UTC

[62/77] [abbrv] incubator-gobblin git commit: Update Restli schemas for gobblin-service for package rename to org.apache.gobblin

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/Metric.java
----------------------------------------------------------------------
diff --git a/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/Metric.java b/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/Metric.java
deleted file mode 100644
index 6c7fb75..0000000
--- a/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/Metric.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/**
- * Autogenerated by Avro
- *
- * DO NOT EDIT DIRECTLY
- */
-package org.apache.gobblin.metrics;
-
-import org.apache.avro.specific.SpecificData;
-
-@SuppressWarnings("all")
-@org.apache.avro.specific.AvroGenerated
-public class Metric extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  private static final long serialVersionUID = 8258013136872494033L;
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Metric\",\"namespace\":\"gobblin.metrics\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"doc\":\"Metric name.\"},{\"name\":\"value\",\"type\":\"double\",\"doc\":\"Metric value.\"}]}");
-  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
-  /** Metric name. */
-  @Deprecated public java.lang.String name;
-  /** Metric value. */
-  @Deprecated public double value;
-
-  /**
-   * Default constructor.  Note that this does not initialize fields
-   * to their default values from the schema.  If that is desired then
-   * one should use <code>newBuilder()</code>.
-   */
-  public Metric() {}
-
-  /**
-   * All-args constructor.
-   * @param name Metric name.
-   * @param value Metric value.
-   */
-  public Metric(java.lang.String name, java.lang.Double value) {
-    this.name = name;
-    this.value = value;
-  }
-
-  public org.apache.avro.Schema getSchema() { return SCHEMA$; }
-  // Used by DatumWriter.  Applications should not call.
-  public java.lang.Object get(int field$) {
-    switch (field$) {
-    case 0: return name;
-    case 1: return value;
-    default: throw new org.apache.avro.AvroRuntimeException("Bad index");
-    }
-  }
-
-  // Used by DatumReader.  Applications should not call.
-  @SuppressWarnings(value="unchecked")
-  public void put(int field$, java.lang.Object value$) {
-    switch (field$) {
-    case 0: name = (java.lang.String)value$; break;
-    case 1: value = (java.lang.Double)value$; break;
-    default: throw new org.apache.avro.AvroRuntimeException("Bad index");
-    }
-  }
-
-  /**
-   * Gets the value of the 'name' field.
-   * @return Metric name.
-   */
-  public java.lang.String getName() {
-    return name;
-  }
-
-  /**
-   * Sets the value of the 'name' field.
-   * Metric name.
-   * @param value the value to set.
-   */
-  public void setName(java.lang.String value) {
-    this.name = value;
-  }
-
-  /**
-   * Gets the value of the 'value' field.
-   * @return Metric value.
-   */
-  public java.lang.Double getValue() {
-    return value;
-  }
-
-  /**
-   * Sets the value of the 'value' field.
-   * Metric value.
-   * @param value the value to set.
-   */
-  public void setValue(java.lang.Double value) {
-    this.value = value;
-  }
-
-  /**
-   * Creates a new Metric RecordBuilder.
-   * @return A new Metric RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.Metric.Builder newBuilder() {
-    return new org.apache.gobblin.metrics.Metric.Builder();
-  }
-
-  /**
-   * Creates a new Metric RecordBuilder by copying an existing Builder.
-   * @param other The existing builder to copy.
-   * @return A new Metric RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.Metric.Builder newBuilder(org.apache.gobblin.metrics.Metric.Builder other) {
-    return new org.apache.gobblin.metrics.Metric.Builder(other);
-  }
-
-  /**
-   * Creates a new Metric RecordBuilder by copying an existing Metric instance.
-   * @param other The existing instance to copy.
-   * @return A new Metric RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.Metric.Builder newBuilder(org.apache.gobblin.metrics.Metric other) {
-    return new org.apache.gobblin.metrics.Metric.Builder(other);
-  }
-
-  /**
-   * RecordBuilder for Metric instances.
-   */
-  public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<Metric>
-    implements org.apache.avro.data.RecordBuilder<Metric> {
-
-    /** Metric name. */
-    private java.lang.String name;
-    /** Metric value. */
-    private double value;
-
-    /** Creates a new Builder */
-    private Builder() {
-      super(SCHEMA$);
-    }
-
-    /**
-     * Creates a Builder by copying an existing Builder.
-     * @param other The existing Builder to copy.
-     */
-    private Builder(org.apache.gobblin.metrics.Metric.Builder other) {
-      super(other);
-      if (isValidValue(fields()[0], other.name)) {
-        this.name = data().deepCopy(fields()[0].schema(), other.name);
-        fieldSetFlags()[0] = true;
-      }
-      if (isValidValue(fields()[1], other.value)) {
-        this.value = data().deepCopy(fields()[1].schema(), other.value);
-        fieldSetFlags()[1] = true;
-      }
-    }
-
-    /**
-     * Creates a Builder by copying an existing Metric instance
-     * @param other The existing instance to copy.
-     */
-    private Builder(org.apache.gobblin.metrics.Metric other) {
-            super(SCHEMA$);
-      if (isValidValue(fields()[0], other.name)) {
-        this.name = data().deepCopy(fields()[0].schema(), other.name);
-        fieldSetFlags()[0] = true;
-      }
-      if (isValidValue(fields()[1], other.value)) {
-        this.value = data().deepCopy(fields()[1].schema(), other.value);
-        fieldSetFlags()[1] = true;
-      }
-    }
-
-    /**
-      * Gets the value of the 'name' field.
-      * Metric name.
-      * @return The value.
-      */
-    public java.lang.String getName() {
-      return name;
-    }
-
-    /**
-      * Sets the value of the 'name' field.
-      * Metric name.
-      * @param value The value of 'name'.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.Metric.Builder setName(java.lang.String value) {
-      validate(fields()[0], value);
-      this.name = value;
-      fieldSetFlags()[0] = true;
-      return this;
-    }
-
-    /**
-      * Checks whether the 'name' field has been set.
-      * Metric name.
-      * @return True if the 'name' field has been set, false otherwise.
-      */
-    public boolean hasName() {
-      return fieldSetFlags()[0];
-    }
-
-
-    /**
-      * Clears the value of the 'name' field.
-      * Metric name.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.Metric.Builder clearName() {
-      name = null;
-      fieldSetFlags()[0] = false;
-      return this;
-    }
-
-    /**
-      * Gets the value of the 'value' field.
-      * Metric value.
-      * @return The value.
-      */
-    public java.lang.Double getValue() {
-      return value;
-    }
-
-    /**
-      * Sets the value of the 'value' field.
-      * Metric value.
-      * @param value The value of 'value'.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.Metric.Builder setValue(double value) {
-      validate(fields()[1], value);
-      this.value = value;
-      fieldSetFlags()[1] = true;
-      return this;
-    }
-
-    /**
-      * Checks whether the 'value' field has been set.
-      * Metric value.
-      * @return True if the 'value' field has been set, false otherwise.
-      */
-    public boolean hasValue() {
-      return fieldSetFlags()[1];
-    }
-
-
-    /**
-      * Clears the value of the 'value' field.
-      * Metric value.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.Metric.Builder clearValue() {
-      fieldSetFlags()[1] = false;
-      return this;
-    }
-
-    @Override
-    public Metric build() {
-      try {
-        Metric record = new Metric();
-        record.name = fieldSetFlags()[0] ? this.name : (java.lang.String) defaultValue(fields()[0]);
-        record.value = fieldSetFlags()[1] ? this.value : (java.lang.Double) defaultValue(fields()[1]);
-        return record;
-      } catch (Exception e) {
-        throw new org.apache.avro.AvroRuntimeException(e);
-      }
-    }
-  }
-
-  private static final org.apache.avro.io.DatumWriter
-    WRITER$ = new org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
-
-  @Override public void writeExternal(java.io.ObjectOutput out)
-    throws java.io.IOException {
-    WRITER$.write(this, SpecificData.getEncoder(out));
-  }
-
-  private static final org.apache.avro.io.DatumReader
-    READER$ = new org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
-
-  @Override public void readExternal(java.io.ObjectInput in)
-    throws java.io.IOException {
-    READER$.read(this, SpecificData.getDecoder(in));
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/MetricReport.java
----------------------------------------------------------------------
diff --git a/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/MetricReport.java b/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/MetricReport.java
deleted file mode 100644
index ca752ca..0000000
--- a/gobblin-metrics-libs/gobblin-metrics-base/src/main/gen-java/org/apache/gobblin/metrics/MetricReport.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/**
- * Autogenerated by Avro
- *
- * DO NOT EDIT DIRECTLY
- */
-package org.apache.gobblin.metrics;
-
-import org.apache.avro.specific.SpecificData;
-
-@SuppressWarnings("all")
-@org.apache.avro.specific.AvroGenerated
-public class MetricReport extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  private static final long serialVersionUID = 8071998973089804574L;
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"MetricReport\",\"namespace\":\"gobblin.metrics\",\"fields\":[{\"name\":\"tags\",\"type\":{\"type\":\"map\",\"values\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"avro.java.string\":\"String\"},\"doc\":\"Tags associated with the metrics.\"},{\"name\":\"timestamp\",\"type\":\"long\",\"doc\":\"Time at which metrics were reported.\"},{\"name\":\"metrics\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"Metric\",\"fields\":[{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"doc\":\"Metric name.\"},{\"name\":\"value\",\"type\":\"double\",\"doc\":\"Metric value.\"}]}},\"doc\":\"Array of metrics in this report.\"}]}");
-  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
-  /** Tags associated with the metrics. */
-  @Deprecated public java.util.Map<java.lang.String,java.lang.String> tags;
-  /** Time at which metrics were reported. */
-  @Deprecated public long timestamp;
-  /** Array of metrics in this report. */
-  @Deprecated public java.util.List<gobblin.metrics.Metric> metrics;
-
-  /**
-   * Default constructor.  Note that this does not initialize fields
-   * to their default values from the schema.  If that is desired then
-   * one should use <code>newBuilder()</code>.
-   */
-  public MetricReport() {}
-
-  /**
-   * All-args constructor.
-   * @param tags Tags associated with the metrics.
-   * @param timestamp Time at which metrics were reported.
-   * @param metrics Array of metrics in this report.
-   */
-  public MetricReport(java.util.Map<java.lang.String,java.lang.String> tags, java.lang.Long timestamp, java.util.List<gobblin.metrics.Metric> metrics) {
-    this.tags = tags;
-    this.timestamp = timestamp;
-    this.metrics = metrics;
-  }
-
-  public org.apache.avro.Schema getSchema() { return SCHEMA$; }
-  // Used by DatumWriter.  Applications should not call.
-  public java.lang.Object get(int field$) {
-    switch (field$) {
-    case 0: return tags;
-    case 1: return timestamp;
-    case 2: return metrics;
-    default: throw new org.apache.avro.AvroRuntimeException("Bad index");
-    }
-  }
-
-  // Used by DatumReader.  Applications should not call.
-  @SuppressWarnings(value="unchecked")
-  public void put(int field$, java.lang.Object value$) {
-    switch (field$) {
-    case 0: tags = (java.util.Map<java.lang.String,java.lang.String>)value$; break;
-    case 1: timestamp = (java.lang.Long)value$; break;
-    case 2: metrics = (java.util.List<gobblin.metrics.Metric>)value$; break;
-    default: throw new org.apache.avro.AvroRuntimeException("Bad index");
-    }
-  }
-
-  /**
-   * Gets the value of the 'tags' field.
-   * @return Tags associated with the metrics.
-   */
-  public java.util.Map<java.lang.String,java.lang.String> getTags() {
-    return tags;
-  }
-
-  /**
-   * Sets the value of the 'tags' field.
-   * Tags associated with the metrics.
-   * @param value the value to set.
-   */
-  public void setTags(java.util.Map<java.lang.String,java.lang.String> value) {
-    this.tags = value;
-  }
-
-  /**
-   * Gets the value of the 'timestamp' field.
-   * @return Time at which metrics were reported.
-   */
-  public java.lang.Long getTimestamp() {
-    return timestamp;
-  }
-
-  /**
-   * Sets the value of the 'timestamp' field.
-   * Time at which metrics were reported.
-   * @param value the value to set.
-   */
-  public void setTimestamp(java.lang.Long value) {
-    this.timestamp = value;
-  }
-
-  /**
-   * Gets the value of the 'metrics' field.
-   * @return Array of metrics in this report.
-   */
-  public java.util.List<gobblin.metrics.Metric> getMetrics() {
-    return metrics;
-  }
-
-  /**
-   * Sets the value of the 'metrics' field.
-   * Array of metrics in this report.
-   * @param value the value to set.
-   */
-  public void setMetrics(java.util.List<gobblin.metrics.Metric> value) {
-    this.metrics = value;
-  }
-
-  /**
-   * Creates a new MetricReport RecordBuilder.
-   * @return A new MetricReport RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.MetricReport.Builder newBuilder() {
-    return new org.apache.gobblin.metrics.MetricReport.Builder();
-  }
-
-  /**
-   * Creates a new MetricReport RecordBuilder by copying an existing Builder.
-   * @param other The existing builder to copy.
-   * @return A new MetricReport RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.MetricReport.Builder newBuilder(org.apache.gobblin.metrics.MetricReport.Builder other) {
-    return new org.apache.gobblin.metrics.MetricReport.Builder(other);
-  }
-
-  /**
-   * Creates a new MetricReport RecordBuilder by copying an existing MetricReport instance.
-   * @param other The existing instance to copy.
-   * @return A new MetricReport RecordBuilder
-   */
-  public static org.apache.gobblin.metrics.MetricReport.Builder newBuilder(org.apache.gobblin.metrics.MetricReport other) {
-    return new org.apache.gobblin.metrics.MetricReport.Builder(other);
-  }
-
-  /**
-   * RecordBuilder for MetricReport instances.
-   */
-  public static class Builder extends org.apache.avro.specific.SpecificRecordBuilderBase<MetricReport>
-    implements org.apache.avro.data.RecordBuilder<MetricReport> {
-
-    /** Tags associated with the metrics. */
-    private java.util.Map<java.lang.String,java.lang.String> tags;
-    /** Time at which metrics were reported. */
-    private long timestamp;
-    /** Array of metrics in this report. */
-    private java.util.List<gobblin.metrics.Metric> metrics;
-
-    /** Creates a new Builder */
-    private Builder() {
-      super(SCHEMA$);
-    }
-
-    /**
-     * Creates a Builder by copying an existing Builder.
-     * @param other The existing Builder to copy.
-     */
-    private Builder(org.apache.gobblin.metrics.MetricReport.Builder other) {
-      super(other);
-      if (isValidValue(fields()[0], other.tags)) {
-        this.tags = data().deepCopy(fields()[0].schema(), other.tags);
-        fieldSetFlags()[0] = true;
-      }
-      if (isValidValue(fields()[1], other.timestamp)) {
-        this.timestamp = data().deepCopy(fields()[1].schema(), other.timestamp);
-        fieldSetFlags()[1] = true;
-      }
-      if (isValidValue(fields()[2], other.metrics)) {
-        this.metrics = data().deepCopy(fields()[2].schema(), other.metrics);
-        fieldSetFlags()[2] = true;
-      }
-    }
-
-    /**
-     * Creates a Builder by copying an existing MetricReport instance
-     * @param other The existing instance to copy.
-     */
-    private Builder(org.apache.gobblin.metrics.MetricReport other) {
-            super(SCHEMA$);
-      if (isValidValue(fields()[0], other.tags)) {
-        this.tags = data().deepCopy(fields()[0].schema(), other.tags);
-        fieldSetFlags()[0] = true;
-      }
-      if (isValidValue(fields()[1], other.timestamp)) {
-        this.timestamp = data().deepCopy(fields()[1].schema(), other.timestamp);
-        fieldSetFlags()[1] = true;
-      }
-      if (isValidValue(fields()[2], other.metrics)) {
-        this.metrics = data().deepCopy(fields()[2].schema(), other.metrics);
-        fieldSetFlags()[2] = true;
-      }
-    }
-
-    /**
-      * Gets the value of the 'tags' field.
-      * Tags associated with the metrics.
-      * @return The value.
-      */
-    public java.util.Map<java.lang.String,java.lang.String> getTags() {
-      return tags;
-    }
-
-    /**
-      * Sets the value of the 'tags' field.
-      * Tags associated with the metrics.
-      * @param value The value of 'tags'.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder setTags(java.util.Map<java.lang.String,java.lang.String> value) {
-      validate(fields()[0], value);
-      this.tags = value;
-      fieldSetFlags()[0] = true;
-      return this;
-    }
-
-    /**
-      * Checks whether the 'tags' field has been set.
-      * Tags associated with the metrics.
-      * @return True if the 'tags' field has been set, false otherwise.
-      */
-    public boolean hasTags() {
-      return fieldSetFlags()[0];
-    }
-
-
-    /**
-      * Clears the value of the 'tags' field.
-      * Tags associated with the metrics.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder clearTags() {
-      tags = null;
-      fieldSetFlags()[0] = false;
-      return this;
-    }
-
-    /**
-      * Gets the value of the 'timestamp' field.
-      * Time at which metrics were reported.
-      * @return The value.
-      */
-    public java.lang.Long getTimestamp() {
-      return timestamp;
-    }
-
-    /**
-      * Sets the value of the 'timestamp' field.
-      * Time at which metrics were reported.
-      * @param value The value of 'timestamp'.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder setTimestamp(long value) {
-      validate(fields()[1], value);
-      this.timestamp = value;
-      fieldSetFlags()[1] = true;
-      return this;
-    }
-
-    /**
-      * Checks whether the 'timestamp' field has been set.
-      * Time at which metrics were reported.
-      * @return True if the 'timestamp' field has been set, false otherwise.
-      */
-    public boolean hasTimestamp() {
-      return fieldSetFlags()[1];
-    }
-
-
-    /**
-      * Clears the value of the 'timestamp' field.
-      * Time at which metrics were reported.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder clearTimestamp() {
-      fieldSetFlags()[1] = false;
-      return this;
-    }
-
-    /**
-      * Gets the value of the 'metrics' field.
-      * Array of metrics in this report.
-      * @return The value.
-      */
-    public java.util.List<gobblin.metrics.Metric> getMetrics() {
-      return metrics;
-    }
-
-    /**
-      * Sets the value of the 'metrics' field.
-      * Array of metrics in this report.
-      * @param value The value of 'metrics'.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder setMetrics(java.util.List<gobblin.metrics.Metric> value) {
-      validate(fields()[2], value);
-      this.metrics = value;
-      fieldSetFlags()[2] = true;
-      return this;
-    }
-
-    /**
-      * Checks whether the 'metrics' field has been set.
-      * Array of metrics in this report.
-      * @return True if the 'metrics' field has been set, false otherwise.
-      */
-    public boolean hasMetrics() {
-      return fieldSetFlags()[2];
-    }
-
-
-    /**
-      * Clears the value of the 'metrics' field.
-      * Array of metrics in this report.
-      * @return This builder.
-      */
-    public org.apache.gobblin.metrics.MetricReport.Builder clearMetrics() {
-      metrics = null;
-      fieldSetFlags()[2] = false;
-      return this;
-    }
-
-    @Override
-    public MetricReport build() {
-      try {
-        MetricReport record = new MetricReport();
-        record.tags = fieldSetFlags()[0] ? this.tags : (java.util.Map<java.lang.String,java.lang.String>) defaultValue(fields()[0]);
-        record.timestamp = fieldSetFlags()[1] ? this.timestamp : (java.lang.Long) defaultValue(fields()[1]);
-        record.metrics = fieldSetFlags()[2] ? this.metrics : (java.util.List<gobblin.metrics.Metric>) defaultValue(fields()[2]);
-        return record;
-      } catch (Exception e) {
-        throw new org.apache.avro.AvroRuntimeException(e);
-      }
-    }
-  }
-
-  private static final org.apache.avro.io.DatumWriter
-    WRITER$ = new org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
-
-  @Override public void writeExternal(java.io.ObjectOutput out)
-    throws java.io.IOException {
-    WRITER$.write(this, SpecificData.getEncoder(out));
-  }
-
-  private static final org.apache.avro.io.DatumReader
-    READER$ = new org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
-
-  @Override public void readExternal(java.io.ObjectInput in)
-    throws java.io.IOException {
-    READER$.read(this, SpecificData.getDecoder(in));
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-rest-service/gobblin-rest-api/src/main/idl/gobblin.rest.jobExecutions.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-rest-service/gobblin-rest-api/src/main/idl/gobblin.rest.jobExecutions.restspec.json b/gobblin-rest-service/gobblin-rest-api/src/main/idl/gobblin.rest.jobExecutions.restspec.json
deleted file mode 100644
index a63ca5a..0000000
--- a/gobblin-rest-service/gobblin-rest-api/src/main/idl/gobblin.rest.jobExecutions.restspec.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name" : "jobExecutions",
-  "namespace" : "org.apache.gobblin.rest",
-  "path" : "/jobExecutions",
-  "schema" : "org.apache.gobblin.rest.JobExecutionQueryResult",
-  "doc" : "A Rest.li resource for serving queries of Gobblin job executions.\n\ngenerated from: org.apache.gobblin.rest.JobExecutionInfoResource",
-  "collection" : {
-    "identifier" : {
-      "name" : "jobExecutionsId",
-      "type" : "org.apache.gobblin.rest.JobExecutionQuery",
-      "params" : "com.linkedin.restli.common.EmptyRecord"
-    },
-    "supports" : [ "batch_get", "get" ],
-    "methods" : [ {
-      "method" : "get"
-    }, {
-      "method" : "batch_get"
-    } ],
-    "entity" : {
-      "path" : "/jobExecutions/{jobExecutionsId}"
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-rest-service/gobblin-rest-api/src/main/idl/org.apache.gobblin.rest.jobExecutions.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-rest-service/gobblin-rest-api/src/main/idl/org.apache.gobblin.rest.jobExecutions.restspec.json b/gobblin-rest-service/gobblin-rest-api/src/main/idl/org.apache.gobblin.rest.jobExecutions.restspec.json
new file mode 100644
index 0000000..a63ca5a
--- /dev/null
+++ b/gobblin-rest-service/gobblin-rest-api/src/main/idl/org.apache.gobblin.rest.jobExecutions.restspec.json
@@ -0,0 +1,23 @@
+{
+  "name" : "jobExecutions",
+  "namespace" : "org.apache.gobblin.rest",
+  "path" : "/jobExecutions",
+  "schema" : "org.apache.gobblin.rest.JobExecutionQueryResult",
+  "doc" : "A Rest.li resource for serving queries of Gobblin job executions.\n\ngenerated from: org.apache.gobblin.rest.JobExecutionInfoResource",
+  "collection" : {
+    "identifier" : {
+      "name" : "jobExecutionsId",
+      "type" : "org.apache.gobblin.rest.JobExecutionQuery",
+      "params" : "com.linkedin.restli.common.EmptyRecord"
+    },
+    "supports" : [ "batch_get", "get" ],
+    "methods" : [ {
+      "method" : "get"
+    }, {
+      "method" : "batch_get"
+    } ],
+    "entity" : {
+      "path" : "/jobExecutions/{jobExecutionsId}"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/gobblin.rest.jobExecutions.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/gobblin.rest.jobExecutions.snapshot.json b/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/gobblin.rest.jobExecutions.snapshot.json
deleted file mode 100644
index 4f6a7e3..0000000
--- a/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/gobblin.rest.jobExecutions.snapshot.json
+++ /dev/null
@@ -1,350 +0,0 @@
-{
-  "models" : [ {
-    "type" : "enum",
-    "name" : "JobStateEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "PENDING", "RUNNING", "SUCCESSFUL", "COMMITTED", "FAILED", "CANCELLED" ]
-  }, {
-    "type" : "enum",
-    "name" : "LauncherTypeEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "LOCAL", "MAPREDUCE", "CLUSTER", "YARN" ]
-  }, {
-    "type" : "enum",
-    "name" : "TaskStateEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "PENDING", "RUNNING", "SUCCESSFUL", "COMMITTED", "FAILED", "CANCELLED" ]
-  }, {
-    "type" : "enum",
-    "name" : "TableTypeEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "SNAPSHOT_ONLY", "SNAPSHOT_APPEND", "APPEND_ONLY" ]
-  }, {
-    "type" : "record",
-    "name" : "Table",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin table definition",
-    "fields" : [ {
-      "name" : "namespace",
-      "type" : "string",
-      "doc" : "Table namespace",
-      "optional" : true
-    }, {
-      "name" : "name",
-      "type" : "string",
-      "doc" : "Table name"
-    }, {
-      "name" : "type",
-      "type" : "TableTypeEnum",
-      "doc" : "Table type",
-      "optional" : true
-    } ]
-  }, {
-    "type" : "enum",
-    "name" : "MetricTypeEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "COUNTER", "METER", "GAUGE" ]
-  }, {
-    "type" : "record",
-    "name" : "Metric",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin metric",
-    "fields" : [ {
-      "name" : "group",
-      "type" : "string",
-      "doc" : "Metric group"
-    }, {
-      "name" : "name",
-      "type" : "string",
-      "doc" : "Metric name"
-    }, {
-      "name" : "type",
-      "type" : "MetricTypeEnum",
-      "doc" : "Metric type"
-    }, {
-      "name" : "value",
-      "type" : "string",
-      "doc" : "Metric value"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "TaskExecutionInfo",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin task execution information",
-    "fields" : [ {
-      "name" : "jobId",
-      "type" : "string",
-      "doc" : "Job ID"
-    }, {
-      "name" : "taskId",
-      "type" : "string",
-      "doc" : "Task ID"
-    }, {
-      "name" : "startTime",
-      "type" : "long",
-      "doc" : "Task start time (epoch time)",
-      "optional" : true
-    }, {
-      "name" : "endTime",
-      "type" : "long",
-      "doc" : "Task end time (epoch time)",
-      "optional" : true
-    }, {
-      "name" : "duration",
-      "type" : "long",
-      "doc" : "Task duration in milliseconds",
-      "optional" : true
-    }, {
-      "name" : "state",
-      "type" : "TaskStateEnum",
-      "doc" : "Task state",
-      "optional" : true
-    }, {
-      "name" : "failureException",
-      "type" : "string",
-      "doc" : "Task failure exception message",
-      "optional" : true
-    }, {
-      "name" : "lowWatermark",
-      "type" : "long",
-      "doc" : "Low watermark",
-      "optional" : true
-    }, {
-      "name" : "highWatermark",
-      "type" : "long",
-      "doc" : "High watermark",
-      "optional" : true
-    }, {
-      "name" : "table",
-      "type" : "Table",
-      "doc" : "Table definition",
-      "optional" : true
-    }, {
-      "name" : "taskProperties",
-      "type" : {
-        "type" : "map",
-        "values" : "string"
-      },
-      "doc" : "Task properties",
-      "optional" : true
-    }, {
-      "name" : "metrics",
-      "type" : {
-        "type" : "array",
-        "items" : "Metric"
-      },
-      "doc" : "Job metrics"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobExecutionInfo",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin job execution information",
-    "fields" : [ {
-      "name" : "jobName",
-      "type" : "string",
-      "doc" : "Job name"
-    }, {
-      "name" : "jobId",
-      "type" : "string",
-      "doc" : "Job ID"
-    }, {
-      "name" : "startTime",
-      "type" : "long",
-      "doc" : "Job start time (epoch time)",
-      "optional" : true
-    }, {
-      "name" : "endTime",
-      "type" : "long",
-      "doc" : "Job end time (epoch time)",
-      "optional" : true
-    }, {
-      "name" : "duration",
-      "type" : "long",
-      "doc" : "Job duration in milliseconds",
-      "optional" : true
-    }, {
-      "name" : "state",
-      "type" : "JobStateEnum",
-      "doc" : "Job state",
-      "optional" : true
-    }, {
-      "name" : "launchedTasks",
-      "type" : "int",
-      "doc" : "Number of launched tasks",
-      "optional" : true
-    }, {
-      "name" : "completedTasks",
-      "type" : "int",
-      "doc" : "Number of completed tasks",
-      "optional" : true
-    }, {
-      "name" : "launcherType",
-      "type" : "LauncherTypeEnum",
-      "doc" : "Job launcher type",
-      "optional" : true
-    }, {
-      "name" : "trackingUrl",
-      "type" : "string",
-      "doc" : "Job execution tracking URL",
-      "optional" : true
-    }, {
-      "name" : "taskExecutions",
-      "type" : {
-        "type" : "array",
-        "items" : "TaskExecutionInfo"
-      },
-      "doc" : "An array of task execution information records"
-    }, {
-      "name" : "jobProperties",
-      "type" : {
-        "type" : "map",
-        "values" : "string"
-      },
-      "doc" : "Job properties",
-      "optional" : true
-    }, {
-      "name" : "metrics",
-      "type" : {
-        "type" : "array",
-        "items" : "Metric"
-      },
-      "doc" : "Job metrics"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobExecutionQueryResult",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin job execution query result",
-    "fields" : [ {
-      "name" : "jobExecutions",
-      "type" : {
-        "type" : "array",
-        "items" : "JobExecutionInfo"
-      },
-      "doc" : "An array of job execution information records"
-    } ]
-  }, {
-    "type" : "enum",
-    "name" : "QueryListType",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Listing distinct jobs fetches the most recent execution info for each job name in the database. Listing recent jobs fetches the most recent job executions, regardless of job name.",
-    "symbols" : [ "DISTINCT", "RECENT" ]
-  }, {
-    "type" : "enum",
-    "name" : "QueryIdTypeEnum",
-    "namespace" : "org.apache.gobblin.rest",
-    "symbols" : [ "JOB_NAME", "JOB_ID", "TABLE", "LIST_TYPE" ]
-  }, {
-    "type" : "record",
-    "name" : "TimeRange",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Query time range",
-    "fields" : [ {
-      "name" : "startTime",
-      "type" : "string",
-      "doc" : "Start time of the query range",
-      "optional" : true
-    }, {
-      "name" : "endTime",
-      "type" : "string",
-      "doc" : "End time of the query range",
-      "optional" : true
-    }, {
-      "name" : "timeFormat",
-      "type" : "string",
-      "doc" : "Date/time format used to parse the start time and end time"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobExecutionQuery",
-    "namespace" : "org.apache.gobblin.rest",
-    "doc" : "Gobblin job execution query",
-    "fields" : [ {
-      "name" : "id",
-      "type" : [ "string", "Table", "QueryListType" ],
-      "doc" : "Query ID (a job ID, job name, table definition, or list type)"
-    }, {
-      "name" : "idType",
-      "type" : "QueryIdTypeEnum",
-      "doc" : "Query ID type"
-    }, {
-      "name" : "timeRange",
-      "type" : "TimeRange",
-      "doc" : "Query time range",
-      "optional" : true
-    }, {
-      "name" : "limit",
-      "type" : "int",
-      "doc" : "Query limit",
-      "default" : 1,
-      "optional" : true
-    }, {
-      "name" : "jobProperties",
-      "type" : "string",
-      "doc" : "Comma-separated list of job properties to include in the query result",
-      "optional" : true
-    }, {
-      "name" : "taskProperties",
-      "type" : "string",
-      "doc" : "Comma-separated list of task properties to include in the query result",
-      "optional" : true
-    }, {
-      "name" : "includeJobMetrics",
-      "type" : "boolean",
-      "doc" : "true/false if the response should include job metrics (default: true)",
-      "default" : true,
-      "optional" : true
-    }, {
-      "name" : "includeTaskMetrics",
-      "type" : "boolean",
-      "doc" : "true/false if the response should include task metrics (default: true)",
-      "default" : true,
-      "optional" : true
-    }, {
-      "name" : "includeTaskExecutions",
-      "type" : "boolean",
-      "doc" : "true/false if the response should include task executions (default: true)",
-      "default" : true,
-      "optional" : true
-    }, {
-      "name" : "includeJobsWithoutTasks",
-      "type" : "boolean",
-      "doc" : "true/false if the response should include jobs that did not launch tasks (default: true)",
-      "default" : true,
-      "optional" : true
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "EmptyRecord",
-    "namespace" : "com.linkedin.restli.common",
-    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
-    "fields" : [ ],
-    "validate" : {
-      "com.linkedin.restli.common.EmptyRecordValidator" : { }
-    }
-  } ],
-  "schema" : {
-    "name" : "jobExecutions",
-    "namespace" : "org.apache.gobblin.rest",
-    "path" : "/jobExecutions",
-    "schema" : "org.apache.gobblin.rest.JobExecutionQueryResult",
-    "doc" : "A Rest.li resource for serving queries of Gobblin job executions.\n\ngenerated from: org.apache.gobblin.rest.JobExecutionInfoResource",
-    "collection" : {
-      "identifier" : {
-        "name" : "jobExecutionsId",
-        "type" : "org.apache.gobblin.rest.JobExecutionQuery",
-        "params" : "com.linkedin.restli.common.EmptyRecord"
-      },
-      "supports" : [ "batch_get", "get" ],
-      "methods" : [ {
-        "method" : "get"
-      }, {
-        "method" : "batch_get"
-      } ],
-      "entity" : {
-        "path" : "/jobExecutions/{jobExecutionsId}"
-      }
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/org.apache.gobblin.rest.jobExecutions.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/org.apache.gobblin.rest.jobExecutions.snapshot.json b/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/org.apache.gobblin.rest.jobExecutions.snapshot.json
new file mode 100644
index 0000000..4f6a7e3
--- /dev/null
+++ b/gobblin-rest-service/gobblin-rest-api/src/main/snapshot/org.apache.gobblin.rest.jobExecutions.snapshot.json
@@ -0,0 +1,350 @@
+{
+  "models" : [ {
+    "type" : "enum",
+    "name" : "JobStateEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "PENDING", "RUNNING", "SUCCESSFUL", "COMMITTED", "FAILED", "CANCELLED" ]
+  }, {
+    "type" : "enum",
+    "name" : "LauncherTypeEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "LOCAL", "MAPREDUCE", "CLUSTER", "YARN" ]
+  }, {
+    "type" : "enum",
+    "name" : "TaskStateEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "PENDING", "RUNNING", "SUCCESSFUL", "COMMITTED", "FAILED", "CANCELLED" ]
+  }, {
+    "type" : "enum",
+    "name" : "TableTypeEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "SNAPSHOT_ONLY", "SNAPSHOT_APPEND", "APPEND_ONLY" ]
+  }, {
+    "type" : "record",
+    "name" : "Table",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin table definition",
+    "fields" : [ {
+      "name" : "namespace",
+      "type" : "string",
+      "doc" : "Table namespace",
+      "optional" : true
+    }, {
+      "name" : "name",
+      "type" : "string",
+      "doc" : "Table name"
+    }, {
+      "name" : "type",
+      "type" : "TableTypeEnum",
+      "doc" : "Table type",
+      "optional" : true
+    } ]
+  }, {
+    "type" : "enum",
+    "name" : "MetricTypeEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "COUNTER", "METER", "GAUGE" ]
+  }, {
+    "type" : "record",
+    "name" : "Metric",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin metric",
+    "fields" : [ {
+      "name" : "group",
+      "type" : "string",
+      "doc" : "Metric group"
+    }, {
+      "name" : "name",
+      "type" : "string",
+      "doc" : "Metric name"
+    }, {
+      "name" : "type",
+      "type" : "MetricTypeEnum",
+      "doc" : "Metric type"
+    }, {
+      "name" : "value",
+      "type" : "string",
+      "doc" : "Metric value"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "TaskExecutionInfo",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin task execution information",
+    "fields" : [ {
+      "name" : "jobId",
+      "type" : "string",
+      "doc" : "Job ID"
+    }, {
+      "name" : "taskId",
+      "type" : "string",
+      "doc" : "Task ID"
+    }, {
+      "name" : "startTime",
+      "type" : "long",
+      "doc" : "Task start time (epoch time)",
+      "optional" : true
+    }, {
+      "name" : "endTime",
+      "type" : "long",
+      "doc" : "Task end time (epoch time)",
+      "optional" : true
+    }, {
+      "name" : "duration",
+      "type" : "long",
+      "doc" : "Task duration in milliseconds",
+      "optional" : true
+    }, {
+      "name" : "state",
+      "type" : "TaskStateEnum",
+      "doc" : "Task state",
+      "optional" : true
+    }, {
+      "name" : "failureException",
+      "type" : "string",
+      "doc" : "Task failure exception message",
+      "optional" : true
+    }, {
+      "name" : "lowWatermark",
+      "type" : "long",
+      "doc" : "Low watermark",
+      "optional" : true
+    }, {
+      "name" : "highWatermark",
+      "type" : "long",
+      "doc" : "High watermark",
+      "optional" : true
+    }, {
+      "name" : "table",
+      "type" : "Table",
+      "doc" : "Table definition",
+      "optional" : true
+    }, {
+      "name" : "taskProperties",
+      "type" : {
+        "type" : "map",
+        "values" : "string"
+      },
+      "doc" : "Task properties",
+      "optional" : true
+    }, {
+      "name" : "metrics",
+      "type" : {
+        "type" : "array",
+        "items" : "Metric"
+      },
+      "doc" : "Job metrics"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobExecutionInfo",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin job execution information",
+    "fields" : [ {
+      "name" : "jobName",
+      "type" : "string",
+      "doc" : "Job name"
+    }, {
+      "name" : "jobId",
+      "type" : "string",
+      "doc" : "Job ID"
+    }, {
+      "name" : "startTime",
+      "type" : "long",
+      "doc" : "Job start time (epoch time)",
+      "optional" : true
+    }, {
+      "name" : "endTime",
+      "type" : "long",
+      "doc" : "Job end time (epoch time)",
+      "optional" : true
+    }, {
+      "name" : "duration",
+      "type" : "long",
+      "doc" : "Job duration in milliseconds",
+      "optional" : true
+    }, {
+      "name" : "state",
+      "type" : "JobStateEnum",
+      "doc" : "Job state",
+      "optional" : true
+    }, {
+      "name" : "launchedTasks",
+      "type" : "int",
+      "doc" : "Number of launched tasks",
+      "optional" : true
+    }, {
+      "name" : "completedTasks",
+      "type" : "int",
+      "doc" : "Number of completed tasks",
+      "optional" : true
+    }, {
+      "name" : "launcherType",
+      "type" : "LauncherTypeEnum",
+      "doc" : "Job launcher type",
+      "optional" : true
+    }, {
+      "name" : "trackingUrl",
+      "type" : "string",
+      "doc" : "Job execution tracking URL",
+      "optional" : true
+    }, {
+      "name" : "taskExecutions",
+      "type" : {
+        "type" : "array",
+        "items" : "TaskExecutionInfo"
+      },
+      "doc" : "An array of task execution information records"
+    }, {
+      "name" : "jobProperties",
+      "type" : {
+        "type" : "map",
+        "values" : "string"
+      },
+      "doc" : "Job properties",
+      "optional" : true
+    }, {
+      "name" : "metrics",
+      "type" : {
+        "type" : "array",
+        "items" : "Metric"
+      },
+      "doc" : "Job metrics"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobExecutionQueryResult",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin job execution query result",
+    "fields" : [ {
+      "name" : "jobExecutions",
+      "type" : {
+        "type" : "array",
+        "items" : "JobExecutionInfo"
+      },
+      "doc" : "An array of job execution information records"
+    } ]
+  }, {
+    "type" : "enum",
+    "name" : "QueryListType",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Listing distinct jobs fetches the most recent execution info for each job name in the database. Listing recent jobs fetches the most recent job executions, regardless of job name.",
+    "symbols" : [ "DISTINCT", "RECENT" ]
+  }, {
+    "type" : "enum",
+    "name" : "QueryIdTypeEnum",
+    "namespace" : "org.apache.gobblin.rest",
+    "symbols" : [ "JOB_NAME", "JOB_ID", "TABLE", "LIST_TYPE" ]
+  }, {
+    "type" : "record",
+    "name" : "TimeRange",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Query time range",
+    "fields" : [ {
+      "name" : "startTime",
+      "type" : "string",
+      "doc" : "Start time of the query range",
+      "optional" : true
+    }, {
+      "name" : "endTime",
+      "type" : "string",
+      "doc" : "End time of the query range",
+      "optional" : true
+    }, {
+      "name" : "timeFormat",
+      "type" : "string",
+      "doc" : "Date/time format used to parse the start time and end time"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobExecutionQuery",
+    "namespace" : "org.apache.gobblin.rest",
+    "doc" : "Gobblin job execution query",
+    "fields" : [ {
+      "name" : "id",
+      "type" : [ "string", "Table", "QueryListType" ],
+      "doc" : "Query ID (a job ID, job name, table definition, or list type)"
+    }, {
+      "name" : "idType",
+      "type" : "QueryIdTypeEnum",
+      "doc" : "Query ID type"
+    }, {
+      "name" : "timeRange",
+      "type" : "TimeRange",
+      "doc" : "Query time range",
+      "optional" : true
+    }, {
+      "name" : "limit",
+      "type" : "int",
+      "doc" : "Query limit",
+      "default" : 1,
+      "optional" : true
+    }, {
+      "name" : "jobProperties",
+      "type" : "string",
+      "doc" : "Comma-separated list of job properties to include in the query result",
+      "optional" : true
+    }, {
+      "name" : "taskProperties",
+      "type" : "string",
+      "doc" : "Comma-separated list of task properties to include in the query result",
+      "optional" : true
+    }, {
+      "name" : "includeJobMetrics",
+      "type" : "boolean",
+      "doc" : "true/false if the response should include job metrics (default: true)",
+      "default" : true,
+      "optional" : true
+    }, {
+      "name" : "includeTaskMetrics",
+      "type" : "boolean",
+      "doc" : "true/false if the response should include task metrics (default: true)",
+      "default" : true,
+      "optional" : true
+    }, {
+      "name" : "includeTaskExecutions",
+      "type" : "boolean",
+      "doc" : "true/false if the response should include task executions (default: true)",
+      "default" : true,
+      "optional" : true
+    }, {
+      "name" : "includeJobsWithoutTasks",
+      "type" : "boolean",
+      "doc" : "true/false if the response should include jobs that did not launch tasks (default: true)",
+      "default" : true,
+      "optional" : true
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "EmptyRecord",
+    "namespace" : "com.linkedin.restli.common",
+    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
+    "fields" : [ ],
+    "validate" : {
+      "com.linkedin.restli.common.EmptyRecordValidator" : { }
+    }
+  } ],
+  "schema" : {
+    "name" : "jobExecutions",
+    "namespace" : "org.apache.gobblin.rest",
+    "path" : "/jobExecutions",
+    "schema" : "org.apache.gobblin.rest.JobExecutionQueryResult",
+    "doc" : "A Rest.li resource for serving queries of Gobblin job executions.\n\ngenerated from: org.apache.gobblin.rest.JobExecutionInfoResource",
+    "collection" : {
+      "identifier" : {
+        "name" : "jobExecutionsId",
+        "type" : "org.apache.gobblin.rest.JobExecutionQuery",
+        "params" : "com.linkedin.restli.common.EmptyRecord"
+      },
+      "supports" : [ "batch_get", "get" ],
+      "methods" : [ {
+        "method" : "get"
+      }, {
+        "method" : "batch_get"
+      } ],
+      "entity" : {
+        "path" : "/jobExecutions/{jobExecutionsId}"
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowconfigs.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowconfigs.restspec.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowconfigs.restspec.json
deleted file mode 100644
index 68c990c..0000000
--- a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowconfigs.restspec.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "name" : "flowconfigs",
-  "namespace" : "org.apache.gobblin.service",
-  "path" : "/flowconfigs",
-  "schema" : "org.apache.gobblin.service.FlowConfig",
-  "doc" : "Resource for handling flow configuration requests\n\ngenerated from: org.apache.gobblin.service.FlowConfigsResource",
-  "collection" : {
-    "identifier" : {
-      "name" : "id",
-      "type" : "org.apache.gobblin.service.FlowId",
-      "params" : "com.linkedin.restli.common.EmptyRecord"
-    },
-    "supports" : [ "create", "delete", "get", "update" ],
-    "methods" : [ {
-      "method" : "create",
-      "doc" : "Create a flow configuration that the service will forward to execution instances for execution"
-    }, {
-      "method" : "get",
-      "doc" : "Retrieve the flow configuration with the given key"
-    }, {
-      "method" : "update",
-      "doc" : "Update the flow configuration with the specified key. Running flows are not affected.\n An error is raised if the flow configuration does not exist."
-    }, {
-      "method" : "delete",
-      "doc" : "Delete a configured flow. Running flows are not affected. The schedule will be removed for scheduled flows."
-    } ],
-    "entity" : {
-      "path" : "/flowconfigs/{id}"
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowstatuses.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowstatuses.restspec.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowstatuses.restspec.json
deleted file mode 100644
index 7810aa9..0000000
--- a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/gobblin.service.flowstatuses.restspec.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name" : "flowstatuses",
-  "namespace" : "org.apache.gobblin.service",
-  "path" : "/flowstatuses",
-  "schema" : "org.apache.gobblin.service.FlowStatus",
-  "doc" : "Resource for handling flow status requests\n\ngenerated from: org.apache.gobblin.service.FlowStatusResource",
-  "collection" : {
-    "identifier" : {
-      "name" : "id",
-      "type" : "org.apache.gobblin.service.FlowStatusId",
-      "params" : "com.linkedin.restli.common.EmptyRecord"
-    },
-    "supports" : [ "get" ],
-    "methods" : [ {
-      "method" : "get",
-      "doc" : "Retrieve the FlowStatus with the given key"
-    } ],
-    "finders" : [ {
-      "name" : "latestFlowStatus",
-      "parameters" : [ {
-        "name" : "flowId",
-        "type" : "org.apache.gobblin.service.FlowId"
-      } ]
-    } ],
-    "entity" : {
-      "path" : "/flowstatuses/{id}"
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowconfigs.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowconfigs.restspec.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowconfigs.restspec.json
new file mode 100644
index 0000000..68c990c
--- /dev/null
+++ b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowconfigs.restspec.json
@@ -0,0 +1,31 @@
+{
+  "name" : "flowconfigs",
+  "namespace" : "org.apache.gobblin.service",
+  "path" : "/flowconfigs",
+  "schema" : "org.apache.gobblin.service.FlowConfig",
+  "doc" : "Resource for handling flow configuration requests\n\ngenerated from: org.apache.gobblin.service.FlowConfigsResource",
+  "collection" : {
+    "identifier" : {
+      "name" : "id",
+      "type" : "org.apache.gobblin.service.FlowId",
+      "params" : "com.linkedin.restli.common.EmptyRecord"
+    },
+    "supports" : [ "create", "delete", "get", "update" ],
+    "methods" : [ {
+      "method" : "create",
+      "doc" : "Create a flow configuration that the service will forward to execution instances for execution"
+    }, {
+      "method" : "get",
+      "doc" : "Retrieve the flow configuration with the given key"
+    }, {
+      "method" : "update",
+      "doc" : "Update the flow configuration with the specified key. Running flows are not affected.\n An error is raised if the flow configuration does not exist."
+    }, {
+      "method" : "delete",
+      "doc" : "Delete a configured flow. Running flows are not affected. The schedule will be removed for scheduled flows."
+    } ],
+    "entity" : {
+      "path" : "/flowconfigs/{id}"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowstatuses.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowstatuses.restspec.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowstatuses.restspec.json
new file mode 100644
index 0000000..7810aa9
--- /dev/null
+++ b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/idl/org.apache.gobblin.service.flowstatuses.restspec.json
@@ -0,0 +1,29 @@
+{
+  "name" : "flowstatuses",
+  "namespace" : "org.apache.gobblin.service",
+  "path" : "/flowstatuses",
+  "schema" : "org.apache.gobblin.service.FlowStatus",
+  "doc" : "Resource for handling flow status requests\n\ngenerated from: org.apache.gobblin.service.FlowStatusResource",
+  "collection" : {
+    "identifier" : {
+      "name" : "id",
+      "type" : "org.apache.gobblin.service.FlowStatusId",
+      "params" : "com.linkedin.restli.common.EmptyRecord"
+    },
+    "supports" : [ "get" ],
+    "methods" : [ {
+      "method" : "get",
+      "doc" : "Retrieve the FlowStatus with the given key"
+    } ],
+    "finders" : [ {
+      "name" : "latestFlowStatus",
+      "parameters" : [ {
+        "name" : "flowId",
+        "type" : "org.apache.gobblin.service.FlowId"
+      } ]
+    } ],
+    "entity" : {
+      "path" : "/flowstatuses/{id}"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowconfigs.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowconfigs.snapshot.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowconfigs.snapshot.json
deleted file mode 100644
index 6106b7a..0000000
--- a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowconfigs.snapshot.json
+++ /dev/null
@@ -1,116 +0,0 @@
-{
-  "models" : [ {
-    "type" : "record",
-    "name" : "FlowId",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Identifier for a Gobblin as a Service flow",
-    "fields" : [ {
-      "name" : "flowName",
-      "type" : "string",
-      "doc" : "Name of the flow",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    }, {
-      "name" : "flowGroup",
-      "type" : "string",
-      "doc" : "Group of the flow. This defines the namespace for the flow.",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "Schedule",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Attributes for defining a job schedule",
-    "fields" : [ {
-      "name" : "cronSchedule",
-      "type" : "string",
-      "doc" : "Schedule for flow in cron format",
-      "validate" : {
-        "org.apache.gobblin.service.validator.CronValidator" : { }
-      }
-    }, {
-      "name" : "runImmediately",
-      "type" : "boolean",
-      "doc" : "Set to true to request that a job with a schedule be run immediately in addition to being scheduled",
-      "default" : false
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "FlowConfig",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Defines a flow configuration that can be compiled into Gobblin jobs",
-    "fields" : [ {
-      "name" : "id",
-      "type" : "FlowId",
-      "doc" : "Identifier for the flow"
-    }, {
-      "name" : "schedule",
-      "type" : "Schedule",
-      "doc" : "Optional schedule for when to execution the flow. If a schedule is not specified then the flow is executed immediately.",
-      "optional" : true
-    }, {
-      "name" : "templateUris",
-      "type" : "string",
-      "doc" : "Comma separated list of URIs for templates used in the flow. The template location is defined by the multiproduct that packages the template.",
-      "validate" : {
-        "org.apache.gobblin.service.validator.TemplateUriValidator" : { }
-      }
-    }, {
-      "name" : "properties",
-      "type" : {
-        "type" : "map",
-        "values" : "string"
-      },
-      "doc" : "Properties for the flow. These properties are passed to the compiled Gobblin jobs."
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "EmptyRecord",
-    "namespace" : "com.linkedin.restli.common",
-    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
-    "fields" : [ ],
-    "validate" : {
-      "com.linkedin.restli.common.EmptyRecordValidator" : { }
-    }
-  } ],
-  "schema" : {
-    "name" : "flowconfigs",
-    "namespace" : "org.apache.gobblin.service",
-    "path" : "/flowconfigs",
-    "schema" : "org.apache.gobblin.service.FlowConfig",
-    "doc" : "Resource for handling flow configuration requests\n\ngenerated from: org.apache.gobblin.service.FlowConfigsResource",
-    "collection" : {
-      "identifier" : {
-        "name" : "id",
-        "type" : "org.apache.gobblin.service.FlowId",
-        "params" : "com.linkedin.restli.common.EmptyRecord"
-      },
-      "supports" : [ "create", "delete", "get", "update" ],
-      "methods" : [ {
-        "method" : "create",
-        "doc" : "Create a flow configuration that the service will forward to execution instances for execution"
-      }, {
-        "method" : "get",
-        "doc" : "Retrieve the flow configuration with the given key"
-      }, {
-        "method" : "update",
-        "doc" : "Update the flow configuration with the specified key. Running flows are not affected.\n An error is raised if the flow configuration does not exist."
-      }, {
-        "method" : "delete",
-        "doc" : "Delete a configured flow. Running flows are not affected. The schedule will be removed for scheduled flows."
-      } ],
-      "entity" : {
-        "path" : "/flowconfigs/{id}"
-      }
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowstatuses.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowstatuses.snapshot.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowstatuses.snapshot.json
deleted file mode 100644
index 99b6a1f..0000000
--- a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/gobblin.service.flowstatuses.snapshot.json
+++ /dev/null
@@ -1,227 +0,0 @@
-{
-  "models" : [ {
-    "type" : "record",
-    "name" : "FlowStatusId",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Identifier for a specific execution of a flow",
-    "fields" : [ {
-      "name" : "flowName",
-      "type" : "string",
-      "doc" : "Name of the flow"
-    }, {
-      "name" : "flowGroup",
-      "type" : "string",
-      "doc" : "Group of the flow. This defines the namespace for the flow."
-    }, {
-      "name" : "flowExecutionId",
-      "type" : "long",
-      "doc" : "Execution id for the flow"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "FlowStatistics",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Statistics from a flow execution",
-    "fields" : [ {
-      "name" : "executionStartTime",
-      "type" : "long",
-      "doc" : "Epoch time of when the execution began"
-    }, {
-      "name" : "executionEndTime",
-      "type" : "long",
-      "doc" : "Epoch time of when the execution ended"
-    } ]
-  }, {
-    "type" : "enum",
-    "name" : "ExecutionStatus",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Execution status for a flow or job",
-    "symbols" : [ "RUNNING", "FAILED", "COMPLETE" ],
-    "symbolDocs" : {
-      "RUNNING" : "Flow or job is currently executing",
-      "FAILED" : "Flow or job failed",
-      "COMPLETE" : "Flow or job completed execution"
-    }
-  }, {
-    "type" : "record",
-    "name" : "FlowId",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Identifier for a Gobblin as a Service flow",
-    "fields" : [ {
-      "name" : "flowName",
-      "type" : "string",
-      "doc" : "Name of the flow",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    }, {
-      "name" : "flowGroup",
-      "type" : "string",
-      "doc" : "Group of the flow. This defines the namespace for the flow.",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobId",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Identifier for a Gobblin job",
-    "fields" : [ {
-      "name" : "jobName",
-      "type" : "string",
-      "doc" : "Name of the job",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    }, {
-      "name" : "jobGroup",
-      "type" : "string",
-      "doc" : "Group of the job. This defines the namespace for the job.",
-      "validate" : {
-        "strlen" : {
-          "min" : 1,
-          "max" : 128
-        }
-      }
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobStatistics",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Statistics from a job execution",
-    "fields" : [ {
-      "name" : "executionStartTime",
-      "type" : "long",
-      "doc" : "Epoch time of when the execution began"
-    }, {
-      "name" : "executionEndTime",
-      "type" : "long",
-      "doc" : "Epoch time of when the execution ended"
-    }, {
-      "name" : "processedCount",
-      "type" : "long",
-      "doc" : "number of records processed in the last job execution"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobState",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Job state that is updated at the end of an execution",
-    "fields" : [ {
-      "name" : "lowWatermark",
-      "type" : "string",
-      "doc" : "Low watermark after last execution"
-    }, {
-      "name" : "highWatermark",
-      "type" : "string",
-      "doc" : "High watermark after last execution"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "JobStatus",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Execution status for a job",
-    "fields" : [ {
-      "name" : "flowId",
-      "type" : "FlowId",
-      "doc" : "Identifier of the flow the job belongs to"
-    }, {
-      "name" : "jobId",
-      "type" : "JobId",
-      "doc" : "Identifier of the job"
-    }, {
-      "name" : "executionStatus",
-      "type" : "ExecutionStatus",
-      "doc" : "Job execution status"
-    }, {
-      "name" : "message",
-      "type" : "string",
-      "doc" : "Error or status message"
-    }, {
-      "name" : "executionStatistics",
-      "type" : "JobStatistics",
-      "doc" : "Statistics from the job execution. The values may be updated during the run of a job."
-    }, {
-      "name" : "jobState",
-      "type" : "JobState",
-      "doc" : "Job state that is updated only at the start and end of a job execution."
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "FlowStatus",
-    "namespace" : "org.apache.gobblin.service",
-    "doc" : "Status of a flow",
-    "fields" : [ {
-      "name" : "id",
-      "type" : "FlowStatusId",
-      "doc" : "Flow status identifier"
-    }, {
-      "name" : "executionStatistics",
-      "type" : "FlowStatistics",
-      "doc" : "Statistics for this execution of the flow"
-    }, {
-      "name" : "executionStatus",
-      "type" : "ExecutionStatus",
-      "doc" : "Flow execution status"
-    }, {
-      "name" : "message",
-      "type" : "string",
-      "doc" : "Error or status message"
-    }, {
-      "name" : "jobStatuses",
-      "type" : {
-        "type" : "array",
-        "items" : "JobStatus"
-      },
-      "doc" : "Status of jobs belonging to the flow"
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "EmptyRecord",
-    "namespace" : "com.linkedin.restli.common",
-    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
-    "fields" : [ ],
-    "validate" : {
-      "com.linkedin.restli.common.EmptyRecordValidator" : { }
-    }
-  } ],
-  "schema" : {
-    "name" : "flowstatuses",
-    "namespace" : "org.apache.gobblin.service",
-    "path" : "/flowstatuses",
-    "schema" : "org.apache.gobblin.service.FlowStatus",
-    "doc" : "Resource for handling flow status requests\n\ngenerated from: org.apache.gobblin.service.FlowStatusResource",
-    "collection" : {
-      "identifier" : {
-        "name" : "id",
-        "type" : "org.apache.gobblin.service.FlowStatusId",
-        "params" : "com.linkedin.restli.common.EmptyRecord"
-      },
-      "supports" : [ "get" ],
-      "methods" : [ {
-        "method" : "get",
-        "doc" : "Retrieve the FlowStatus with the given key"
-      } ],
-      "finders" : [ {
-        "name" : "latestFlowStatus",
-        "parameters" : [ {
-          "name" : "flowId",
-          "type" : "org.apache.gobblin.service.FlowId"
-        } ]
-      } ],
-      "entity" : {
-        "path" : "/flowstatuses/{id}"
-      }
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowconfigs.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowconfigs.snapshot.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowconfigs.snapshot.json
new file mode 100644
index 0000000..6106b7a
--- /dev/null
+++ b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowconfigs.snapshot.json
@@ -0,0 +1,116 @@
+{
+  "models" : [ {
+    "type" : "record",
+    "name" : "FlowId",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Identifier for a Gobblin as a Service flow",
+    "fields" : [ {
+      "name" : "flowName",
+      "type" : "string",
+      "doc" : "Name of the flow",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    }, {
+      "name" : "flowGroup",
+      "type" : "string",
+      "doc" : "Group of the flow. This defines the namespace for the flow.",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "Schedule",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Attributes for defining a job schedule",
+    "fields" : [ {
+      "name" : "cronSchedule",
+      "type" : "string",
+      "doc" : "Schedule for flow in cron format",
+      "validate" : {
+        "org.apache.gobblin.service.validator.CronValidator" : { }
+      }
+    }, {
+      "name" : "runImmediately",
+      "type" : "boolean",
+      "doc" : "Set to true to request that a job with a schedule be run immediately in addition to being scheduled",
+      "default" : false
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "FlowConfig",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Defines a flow configuration that can be compiled into Gobblin jobs",
+    "fields" : [ {
+      "name" : "id",
+      "type" : "FlowId",
+      "doc" : "Identifier for the flow"
+    }, {
+      "name" : "schedule",
+      "type" : "Schedule",
+      "doc" : "Optional schedule for when to execution the flow. If a schedule is not specified then the flow is executed immediately.",
+      "optional" : true
+    }, {
+      "name" : "templateUris",
+      "type" : "string",
+      "doc" : "Comma separated list of URIs for templates used in the flow. The template location is defined by the multiproduct that packages the template.",
+      "validate" : {
+        "org.apache.gobblin.service.validator.TemplateUriValidator" : { }
+      }
+    }, {
+      "name" : "properties",
+      "type" : {
+        "type" : "map",
+        "values" : "string"
+      },
+      "doc" : "Properties for the flow. These properties are passed to the compiled Gobblin jobs."
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "EmptyRecord",
+    "namespace" : "com.linkedin.restli.common",
+    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
+    "fields" : [ ],
+    "validate" : {
+      "com.linkedin.restli.common.EmptyRecordValidator" : { }
+    }
+  } ],
+  "schema" : {
+    "name" : "flowconfigs",
+    "namespace" : "org.apache.gobblin.service",
+    "path" : "/flowconfigs",
+    "schema" : "org.apache.gobblin.service.FlowConfig",
+    "doc" : "Resource for handling flow configuration requests\n\ngenerated from: org.apache.gobblin.service.FlowConfigsResource",
+    "collection" : {
+      "identifier" : {
+        "name" : "id",
+        "type" : "org.apache.gobblin.service.FlowId",
+        "params" : "com.linkedin.restli.common.EmptyRecord"
+      },
+      "supports" : [ "create", "delete", "get", "update" ],
+      "methods" : [ {
+        "method" : "create",
+        "doc" : "Create a flow configuration that the service will forward to execution instances for execution"
+      }, {
+        "method" : "get",
+        "doc" : "Retrieve the flow configuration with the given key"
+      }, {
+        "method" : "update",
+        "doc" : "Update the flow configuration with the specified key. Running flows are not affected.\n An error is raised if the flow configuration does not exist."
+      }, {
+        "method" : "delete",
+        "doc" : "Delete a configured flow. Running flows are not affected. The schedule will be removed for scheduled flows."
+      } ],
+      "entity" : {
+        "path" : "/flowconfigs/{id}"
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowstatuses.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowstatuses.snapshot.json b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowstatuses.snapshot.json
new file mode 100644
index 0000000..99b6a1f
--- /dev/null
+++ b/gobblin-restli/gobblin-flow-config-service/gobblin-flow-config-service-api/src/main/snapshot/org.apache.gobblin.service.flowstatuses.snapshot.json
@@ -0,0 +1,227 @@
+{
+  "models" : [ {
+    "type" : "record",
+    "name" : "FlowStatusId",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Identifier for a specific execution of a flow",
+    "fields" : [ {
+      "name" : "flowName",
+      "type" : "string",
+      "doc" : "Name of the flow"
+    }, {
+      "name" : "flowGroup",
+      "type" : "string",
+      "doc" : "Group of the flow. This defines the namespace for the flow."
+    }, {
+      "name" : "flowExecutionId",
+      "type" : "long",
+      "doc" : "Execution id for the flow"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "FlowStatistics",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Statistics from a flow execution",
+    "fields" : [ {
+      "name" : "executionStartTime",
+      "type" : "long",
+      "doc" : "Epoch time of when the execution began"
+    }, {
+      "name" : "executionEndTime",
+      "type" : "long",
+      "doc" : "Epoch time of when the execution ended"
+    } ]
+  }, {
+    "type" : "enum",
+    "name" : "ExecutionStatus",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Execution status for a flow or job",
+    "symbols" : [ "RUNNING", "FAILED", "COMPLETE" ],
+    "symbolDocs" : {
+      "RUNNING" : "Flow or job is currently executing",
+      "FAILED" : "Flow or job failed",
+      "COMPLETE" : "Flow or job completed execution"
+    }
+  }, {
+    "type" : "record",
+    "name" : "FlowId",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Identifier for a Gobblin as a Service flow",
+    "fields" : [ {
+      "name" : "flowName",
+      "type" : "string",
+      "doc" : "Name of the flow",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    }, {
+      "name" : "flowGroup",
+      "type" : "string",
+      "doc" : "Group of the flow. This defines the namespace for the flow.",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobId",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Identifier for a Gobblin job",
+    "fields" : [ {
+      "name" : "jobName",
+      "type" : "string",
+      "doc" : "Name of the job",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    }, {
+      "name" : "jobGroup",
+      "type" : "string",
+      "doc" : "Group of the job. This defines the namespace for the job.",
+      "validate" : {
+        "strlen" : {
+          "min" : 1,
+          "max" : 128
+        }
+      }
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobStatistics",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Statistics from a job execution",
+    "fields" : [ {
+      "name" : "executionStartTime",
+      "type" : "long",
+      "doc" : "Epoch time of when the execution began"
+    }, {
+      "name" : "executionEndTime",
+      "type" : "long",
+      "doc" : "Epoch time of when the execution ended"
+    }, {
+      "name" : "processedCount",
+      "type" : "long",
+      "doc" : "number of records processed in the last job execution"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobState",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Job state that is updated at the end of an execution",
+    "fields" : [ {
+      "name" : "lowWatermark",
+      "type" : "string",
+      "doc" : "Low watermark after last execution"
+    }, {
+      "name" : "highWatermark",
+      "type" : "string",
+      "doc" : "High watermark after last execution"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "JobStatus",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Execution status for a job",
+    "fields" : [ {
+      "name" : "flowId",
+      "type" : "FlowId",
+      "doc" : "Identifier of the flow the job belongs to"
+    }, {
+      "name" : "jobId",
+      "type" : "JobId",
+      "doc" : "Identifier of the job"
+    }, {
+      "name" : "executionStatus",
+      "type" : "ExecutionStatus",
+      "doc" : "Job execution status"
+    }, {
+      "name" : "message",
+      "type" : "string",
+      "doc" : "Error or status message"
+    }, {
+      "name" : "executionStatistics",
+      "type" : "JobStatistics",
+      "doc" : "Statistics from the job execution. The values may be updated during the run of a job."
+    }, {
+      "name" : "jobState",
+      "type" : "JobState",
+      "doc" : "Job state that is updated only at the start and end of a job execution."
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "FlowStatus",
+    "namespace" : "org.apache.gobblin.service",
+    "doc" : "Status of a flow",
+    "fields" : [ {
+      "name" : "id",
+      "type" : "FlowStatusId",
+      "doc" : "Flow status identifier"
+    }, {
+      "name" : "executionStatistics",
+      "type" : "FlowStatistics",
+      "doc" : "Statistics for this execution of the flow"
+    }, {
+      "name" : "executionStatus",
+      "type" : "ExecutionStatus",
+      "doc" : "Flow execution status"
+    }, {
+      "name" : "message",
+      "type" : "string",
+      "doc" : "Error or status message"
+    }, {
+      "name" : "jobStatuses",
+      "type" : {
+        "type" : "array",
+        "items" : "JobStatus"
+      },
+      "doc" : "Status of jobs belonging to the flow"
+    } ]
+  }, {
+    "type" : "record",
+    "name" : "EmptyRecord",
+    "namespace" : "com.linkedin.restli.common",
+    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
+    "fields" : [ ],
+    "validate" : {
+      "com.linkedin.restli.common.EmptyRecordValidator" : { }
+    }
+  } ],
+  "schema" : {
+    "name" : "flowstatuses",
+    "namespace" : "org.apache.gobblin.service",
+    "path" : "/flowstatuses",
+    "schema" : "org.apache.gobblin.service.FlowStatus",
+    "doc" : "Resource for handling flow status requests\n\ngenerated from: org.apache.gobblin.service.FlowStatusResource",
+    "collection" : {
+      "identifier" : {
+        "name" : "id",
+        "type" : "org.apache.gobblin.service.FlowStatusId",
+        "params" : "com.linkedin.restli.common.EmptyRecord"
+      },
+      "supports" : [ "get" ],
+      "methods" : [ {
+        "method" : "get",
+        "doc" : "Retrieve the FlowStatus with the given key"
+      } ],
+      "finders" : [ {
+        "name" : "latestFlowStatus",
+        "parameters" : [ {
+          "name" : "flowId",
+          "type" : "org.apache.gobblin.service.FlowId"
+        } ]
+      } ],
+      "entity" : {
+        "path" : "/flowstatuses/{id}"
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/gobblin.restli.throttling.permits.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/gobblin.restli.throttling.permits.restspec.json b/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/gobblin.restli.throttling.permits.restspec.json
deleted file mode 100644
index b4415f0..0000000
--- a/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/gobblin.restli.throttling.permits.restspec.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "name" : "permits",
-  "namespace" : "org.apache.gobblin.restli.throttling",
-  "path" : "/permits",
-  "schema" : "org.apache.gobblin.restli.throttling.PermitAllocation",
-  "doc" : "Restli resource for allocating permits through Rest calls. Simply calls a {@link Limiter} in the server configured\n through {@link SharedResourcesBroker}.\n\ngenerated from: org.apache.gobblin.restli.throttling.LimiterServerResource",
-  "collection" : {
-    "identifier" : {
-      "name" : "permitsId",
-      "type" : "org.apache.gobblin.restli.throttling.PermitRequest",
-      "params" : "com.linkedin.restli.common.EmptyRecord"
-    },
-    "supports" : [ "get" ],
-    "methods" : [ {
-      "method" : "get",
-      "doc" : "Request permits from the limiter server. The returned {@link PermitAllocation} specifies the number of permits\n that the client can use."
-    } ],
-    "entity" : {
-      "path" : "/permits/{permitsId}"
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/org.apache.gobblin.restli.throttling.permits.restspec.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/org.apache.gobblin.restli.throttling.permits.restspec.json b/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/org.apache.gobblin.restli.throttling.permits.restspec.json
new file mode 100644
index 0000000..b4415f0
--- /dev/null
+++ b/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/idl/org.apache.gobblin.restli.throttling.permits.restspec.json
@@ -0,0 +1,22 @@
+{
+  "name" : "permits",
+  "namespace" : "org.apache.gobblin.restli.throttling",
+  "path" : "/permits",
+  "schema" : "org.apache.gobblin.restli.throttling.PermitAllocation",
+  "doc" : "Restli resource for allocating permits through Rest calls. Simply calls a {@link Limiter} in the server configured\n through {@link SharedResourcesBroker}.\n\ngenerated from: org.apache.gobblin.restli.throttling.LimiterServerResource",
+  "collection" : {
+    "identifier" : {
+      "name" : "permitsId",
+      "type" : "org.apache.gobblin.restli.throttling.PermitRequest",
+      "params" : "com.linkedin.restli.common.EmptyRecord"
+    },
+    "supports" : [ "get" ],
+    "methods" : [ {
+      "method" : "get",
+      "doc" : "Request permits from the limiter server. The returned {@link PermitAllocation} specifies the number of permits\n that the client can use."
+    } ],
+    "entity" : {
+      "path" : "/permits/{permitsId}"
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/92e1276e/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/snapshot/gobblin.restli.throttling.permits.snapshot.json
----------------------------------------------------------------------
diff --git a/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/snapshot/gobblin.restli.throttling.permits.snapshot.json b/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/snapshot/gobblin.restli.throttling.permits.snapshot.json
deleted file mode 100644
index 90fdd8d..0000000
--- a/gobblin-restli/gobblin-throttling-service/gobblin-throttling-service-api/src/main/snapshot/gobblin.restli.throttling.permits.snapshot.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "models" : [ {
-    "type" : "record",
-    "name" : "PermitAllocation",
-    "namespace" : "org.apache.gobblin.restli.throttling",
-    "doc" : "Used by gobblin-throttling-service to allocate permits to a client.",
-    "fields" : [ {
-      "name" : "permits",
-      "type" : "long",
-      "doc" : "Number of permits allocated. This may be 0 if no permits are allocated, or the number of requested permits."
-    }, {
-      "name" : "expiration",
-      "type" : "long",
-      "doc" : "Expiration time in Unix timestamp of the allocated permits."
-    }, {
-      "name" : "minRetryDelayMillis",
-      "type" : "long",
-      "doc" : "Client should not try to acquire permits before this delay has passed.",
-      "optional" : true
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "PermitRequest",
-    "namespace" : "org.apache.gobblin.restli.throttling",
-    "doc" : "Used to request permits from a gobblin-throttling-service.",
-    "fields" : [ {
-      "name" : "resource",
-      "type" : "string",
-      "doc" : "Resource for which permits are needed."
-    }, {
-      "name" : "permits",
-      "type" : "long",
-      "doc" : "Number of permits needed."
-    }, {
-      "name" : "minPermits",
-      "type" : "long",
-      "doc" : "Minimum number of useful permits.",
-      "optional" : true
-    }, {
-      "name" : "requestorIdentifier",
-      "type" : "string",
-      "doc" : "Identifier of the service requesting the permits."
-    } ]
-  }, {
-    "type" : "record",
-    "name" : "EmptyRecord",
-    "namespace" : "com.linkedin.restli.common",
-    "doc" : "An literally empty record.  Intended as a marker to indicate the absence of content where a record type is required.  If used the underlying DataMap *must* be empty, EmptyRecordValidator is provided to help enforce this.  For example,  CreateRequest extends Request<EmptyRecord> to indicate it has no response body.   Also, a ComplexKeyResource implementation that has no ParamKey should have a signature like XyzResource implements ComplexKeyResource<XyzKey, EmptyRecord, Xyz>.",
-    "fields" : [ ],
-    "validate" : {
-      "com.linkedin.restli.common.EmptyRecordValidator" : { }
-    }
-  } ],
-  "schema" : {
-    "name" : "permits",
-    "namespace" : "org.apache.gobblin.restli.throttling",
-    "path" : "/permits",
-    "schema" : "org.apache.gobblin.restli.throttling.PermitAllocation",
-    "doc" : "Restli resource for allocating permits through Rest calls. Simply calls a {@link Limiter} in the server configured\n through {@link SharedResourcesBroker}.\n\ngenerated from: org.apache.gobblin.restli.throttling.LimiterServerResource",
-    "collection" : {
-      "identifier" : {
-        "name" : "permitsId",
-        "type" : "org.apache.gobblin.restli.throttling.PermitRequest",
-        "params" : "com.linkedin.restli.common.EmptyRecord"
-      },
-      "supports" : [ "get" ],
-      "methods" : [ {
-        "method" : "get",
-        "doc" : "Request permits from the limiter server. The returned {@link PermitAllocation} specifies the number of permits\n that the client can use."
-      } ],
-      "entity" : {
-        "path" : "/permits/{permitsId}"
-      }
-    }
-  }
-}
\ No newline at end of file