SLIDER-1197 Provide information on pending allocations, and last allocation time
diff --git a/slider-core/src/main/java/org/apache/slider/api/types/ApplicationLivenessInformation.java b/slider-core/src/main/java/org/apache/slider/api/types/ApplicationLivenessInformation.java
index 9879d05..e72bf58 100644
--- a/slider-core/src/main/java/org/apache/slider/api/types/ApplicationLivenessInformation.java
+++ b/slider-core/src/main/java/org/apache/slider/api/types/ApplicationLivenessInformation.java
@@ -39,12 +39,17 @@
   /** number of requests submitted to YARN */
   public int activeRequests;
 
+  /** stores the allocation time of the most recently created container */
+  public long lastAllocationTime;
+
   @Override
   public String toString() {
     final StringBuilder sb =
         new StringBuilder("ApplicationLivenessInformation{");
     sb.append("allRequestsSatisfied=").append(allRequestsSatisfied);
     sb.append(", requestsOutstanding=").append(requestsOutstanding);
+    sb.append(", activeRequests=").append(activeRequests);
+    sb.append(", lastAllocationTime=").append(lastAllocationTime);
     sb.append('}');
     return sb.toString();
   }
diff --git a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
index 4439aac..59b200d 100644
--- a/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
+++ b/slider-core/src/main/java/org/apache/slider/providers/agent/AgentProviderService.java
@@ -1048,6 +1048,8 @@
         if (currentAppVersion == null
             || currentAppVersion.equals(APP_VERSION_UNKNOWN)) {
           amState.getOwnedContainer(containerId).appVersion = appVersion;
+          amState.getApplicationDiagnostics()
+              .getContainer(containerId).appVersion = appVersion;
         }
       }
     } catch (NoSuchNodeException e) {
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
index 5d588a5..186344d 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
@@ -302,6 +302,8 @@
   private Resource minResource;
   private Resource maxResource;
 
+  private long lastAllocationTime;
+
   /**
    * Create an instance
    * @param recordFactory factory for YARN records
@@ -1499,6 +1501,7 @@
                                      instance);
     }
     instance.startTime = now();
+    this.lastAllocationTime = instance.startTime;
     RoleInstance starting = getStartingContainers().remove(containerId);
     if (null == starting) {
       throw new YarnRuntimeException(
@@ -1925,6 +1928,7 @@
     li.requestsOutstanding = outstanding;
     li.allRequestsSatisfied = outstanding <= 0;
     li.activeRequests = (int)stats.requested;
+    li.lastAllocationTime = this.lastAllocationTime;
     return li;
   }
 
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
index 37e9a7f..5cebdea 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
@@ -23,6 +23,7 @@
 import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.ClusterNode;
+import org.apache.slider.api.types.ApplicationDiagnostics;
 import org.apache.slider.api.types.ApplicationLivenessInformation;
 import org.apache.slider.api.types.ComponentInformation;
 import org.apache.slider.api.types.NodeInformation;
@@ -304,4 +305,9 @@
   public RoleStatistics getRoleStatistics() {
     return appState.getRoleStatistics();
   }
+
+  @Override
+  public ApplicationDiagnostics getApplicationDiagnostics() {
+    return appState.getApplicationDiagnostics();
+  }
 }
diff --git a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
index ad91183..1764d63 100644
--- a/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
+++ b/slider-core/src/main/java/org/apache/slider/server/appmaster/state/StateAccessForProviders.java
@@ -24,6 +24,7 @@
 import org.apache.slider.api.ClusterDescription;
 import org.apache.slider.api.ClusterNode;
 import org.apache.slider.api.StatusKeys;
+import org.apache.slider.api.types.ApplicationDiagnostics;
 import org.apache.slider.api.types.ApplicationLivenessInformation;
 import org.apache.slider.api.types.ComponentInformation;
 import org.apache.slider.api.types.NodeInformation;
@@ -310,4 +311,10 @@
    * @return role statistics
    */
   RoleStatistics getRoleStatistics();
+
+  /**
+   * Get application diagnostics for all containers.
+   * @return application diagnostics
+   */
+  ApplicationDiagnostics getApplicationDiagnostics();
 }