You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by st...@apache.org on 2015/11/22 18:34:58 UTC

[2/2] incubator-slider git commit: SLIDER-994 node information map to list node entries by role name, -fix up protobuf marshallng to match, with tests to prove it

SLIDER-994 node information map to list node entries by role name, -fix up protobuf marshallng to match, with tests to prove it


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/77aeb253
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/77aeb253
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/77aeb253

Branch: refs/heads/feature/SLIDER-82-pass-3.1
Commit: 77aeb2539084d37ee4f735bc0d37aaf554109045
Parents: 134c8d5
Author: Steve Loughran <st...@apache.org>
Authored: Sun Nov 22 17:35:13 2015 +0000
Committer: Steve Loughran <st...@apache.org>
Committed: Sun Nov 22 17:35:13 2015 +0000

----------------------------------------------------------------------
 .../org/apache/slider/api/proto/Messages.java   | 247 ++++++++++++++++---
 .../slider/api/proto/RestTypeMarshalling.java   |  31 +--
 .../slider/server/appmaster/state/AppState.java |  12 +
 .../appmaster/state/ProviderAppState.java       |  16 +-
 .../src/main/proto/SliderClusterMessages.proto  |   1 +
 .../appstate/TestMockAppStateAAPlacement.groovy |  18 ++
 .../model/history/TestRoleHistoryAA.groovy      |  33 +++
 7 files changed, 289 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/main/java/org/apache/slider/api/proto/Messages.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/proto/Messages.java b/slider-core/src/main/java/org/apache/slider/api/proto/Messages.java
index 6dd5849..373d64d 100644
--- a/slider-core/src/main/java/org/apache/slider/api/proto/Messages.java
+++ b/slider-core/src/main/java/org/apache/slider/api/proto/Messages.java
@@ -20414,6 +20414,21 @@ public final class Messages {
      * <code>required int64 lastUsed = 10;</code>
      */
     long getLastUsed();
+
+    // required string name = 11;
+    /**
+     * <code>required string name = 11;</code>
+     */
+    boolean hasName();
+    /**
+     * <code>required string name = 11;</code>
+     */
+    java.lang.String getName();
+    /**
+     * <code>required string name = 11;</code>
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
   }
   /**
    * Protobuf type {@code org.apache.slider.api.NodeEntryInformationProto}
@@ -20516,6 +20531,11 @@ public final class Messages {
               lastUsed_ = input.readInt64();
               break;
             }
+            case 90: {
+              bitField0_ |= 0x00000400;
+              name_ = input.readBytes();
+              break;
+            }
           }
         }
       } catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -20716,6 +20736,49 @@ public final class Messages {
       return lastUsed_;
     }
 
+    // required string name = 11;
+    public static final int NAME_FIELD_NUMBER = 11;
+    private java.lang.Object name_;
+    /**
+     * <code>required string name = 11;</code>
+     */
+    public boolean hasName() {
+      return ((bitField0_ & 0x00000400) == 0x00000400);
+    }
+    /**
+     * <code>required string name = 11;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (bs.isValidUtf8()) {
+          name_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>required string name = 11;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
     private void initFields() {
       priority_ = 0;
       requested_ = 0;
@@ -20727,6 +20790,7 @@ public final class Messages {
       live_ = 0;
       releasing_ = 0;
       lastUsed_ = 0L;
+      name_ = "";
     }
     private byte memoizedIsInitialized = -1;
     public final boolean isInitialized() {
@@ -20773,6 +20837,10 @@ public final class Messages {
         memoizedIsInitialized = 0;
         return false;
       }
+      if (!hasName()) {
+        memoizedIsInitialized = 0;
+        return false;
+      }
       memoizedIsInitialized = 1;
       return true;
     }
@@ -20810,6 +20878,9 @@ public final class Messages {
       if (((bitField0_ & 0x00000200) == 0x00000200)) {
         output.writeInt64(10, lastUsed_);
       }
+      if (((bitField0_ & 0x00000400) == 0x00000400)) {
+        output.writeBytes(11, getNameBytes());
+      }
       getUnknownFields().writeTo(output);
     }
 
@@ -20859,6 +20930,10 @@ public final class Messages {
         size += com.google.protobuf.CodedOutputStream
           .computeInt64Size(10, lastUsed_);
       }
+      if (((bitField0_ & 0x00000400) == 0x00000400)) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBytesSize(11, getNameBytes());
+      }
       size += getUnknownFields().getSerializedSize();
       memoizedSerializedSize = size;
       return size;
@@ -20932,6 +21007,11 @@ public final class Messages {
         result = result && (getLastUsed()
             == other.getLastUsed());
       }
+      result = result && (hasName() == other.hasName());
+      if (hasName()) {
+        result = result && getName()
+            .equals(other.getName());
+      }
       result = result &&
           getUnknownFields().equals(other.getUnknownFields());
       return result;
@@ -20985,6 +21065,10 @@ public final class Messages {
         hash = (37 * hash) + LASTUSED_FIELD_NUMBER;
         hash = (53 * hash) + hashLong(getLastUsed());
       }
+      if (hasName()) {
+        hash = (37 * hash) + NAME_FIELD_NUMBER;
+        hash = (53 * hash) + getName().hashCode();
+      }
       hash = (29 * hash) + getUnknownFields().hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -21114,6 +21198,8 @@ public final class Messages {
         bitField0_ = (bitField0_ & ~0x00000100);
         lastUsed_ = 0L;
         bitField0_ = (bitField0_ & ~0x00000200);
+        name_ = "";
+        bitField0_ = (bitField0_ & ~0x00000400);
         return this;
       }
 
@@ -21182,6 +21268,10 @@ public final class Messages {
           to_bitField0_ |= 0x00000200;
         }
         result.lastUsed_ = lastUsed_;
+        if (((from_bitField0_ & 0x00000400) == 0x00000400)) {
+          to_bitField0_ |= 0x00000400;
+        }
+        result.name_ = name_;
         result.bitField0_ = to_bitField0_;
         onBuilt();
         return result;
@@ -21228,6 +21318,11 @@ public final class Messages {
         if (other.hasLastUsed()) {
           setLastUsed(other.getLastUsed());
         }
+        if (other.hasName()) {
+          bitField0_ |= 0x00000400;
+          name_ = other.name_;
+          onChanged();
+        }
         this.mergeUnknownFields(other.getUnknownFields());
         return this;
       }
@@ -21273,6 +21368,10 @@ public final class Messages {
           
           return false;
         }
+        if (!hasName()) {
+          
+          return false;
+        }
         return true;
       }
 
@@ -21625,6 +21724,80 @@ public final class Messages {
         return this;
       }
 
+      // required string name = 11;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public boolean hasName() {
+        return ((bitField0_ & 0x00000400) == 0x00000400);
+      }
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          java.lang.String s = ((com.google.protobuf.ByteString) ref)
+              .toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000400;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public Builder clearName() {
+        bitField0_ = (bitField0_ & ~0x00000400);
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>required string name = 11;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  bitField0_ |= 0x00000400;
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
       // @@protoc_insertion_point(builder_scope:org.apache.slider.api.NodeEntryInformationProto)
     }
 
@@ -33941,46 +34114,46 @@ public final class Messages {
       "t\030\n \001(\t\022\017\n\007hostURL\030\013 \001(\t\022\021\n\tplacement\030\014 " +
       "\001(\t\022\022\n\nappVersion\030\r \001(\t\"N\n\024PingInformati" +
       "onProto\022\014\n\004text\030\001 \001(\t\022\014\n\004verb\030\002 \001(\t\022\014\n\004b" +
-      "ody\030\003 \001(\t\022\014\n\004time\030\004 \001(\003\"\325\001\n\031NodeEntryInf" +
+      "ody\030\003 \001(\t\022\014\n\004time\030\004 \001(\003\"\343\001\n\031NodeEntryInf" +
       "ormationProto\022\020\n\010priority\030\001 \002(\005\022\021\n\treque",
       "sted\030\002 \002(\005\022\020\n\010starting\030\003 \002(\005\022\023\n\013startFai" +
       "led\030\004 \002(\005\022\016\n\006failed\030\005 \002(\005\022\026\n\016failedRecen" +
       "tly\030\006 \002(\005\022\021\n\tpreempted\030\007 \002(\005\022\014\n\004live\030\010 \002" +
-      "(\005\022\021\n\treleasing\030\t \002(\005\022\020\n\010lastUsed\030\n \002(\003\"" +
-      "\334\001\n\024NodeInformationProto\022\020\n\010hostname\030\001 \002" +
-      "(\t\022\r\n\005state\030\002 \002(\t\022\023\n\013httpAddress\030\003 \002(\t\022\020" +
-      "\n\010rackName\030\004 \002(\t\022\016\n\006labels\030\005 \002(\t\022\024\n\014heal" +
-      "thReport\030\006 \002(\t\022\023\n\013lastUpdated\030\007 \002(\003\022A\n\007e" +
-      "ntries\030\010 \003(\01320.org.apache.slider.api.Nod" +
-      "eEntryInformationProto\"\026\n\024GetModelReques",
-      "tProto\"\035\n\033GetModelDesiredRequestProto\"$\n" +
-      "\"GetModelDesiredAppconfRequestProto\"&\n$G" +
-      "etModelDesiredResourcesRequestProto\"%\n#G" +
-      "etModelResolvedAppconfRequestProto\"\'\n%Ge" +
-      "tModelResolvedResourcesRequestProto\"#\n!G" +
-      "etModelLiveResourcesRequestProto\"\037\n\035GetL" +
-      "iveContainersRequestProto\"u\n\036GetLiveCont" +
-      "ainersResponseProto\022\r\n\005names\030\001 \003(\t\022D\n\nco" +
-      "ntainers\030\002 \003(\01320.org.apache.slider.api.C" +
-      "ontainerInformationProto\"3\n\034GetLiveConta",
-      "inerRequestProto\022\023\n\013containerId\030\001 \002(\t\"\037\n" +
-      "\035GetLiveComponentsRequestProto\"u\n\036GetLiv" +
-      "eComponentsResponseProto\022\r\n\005names\030\001 \003(\t\022" +
-      "D\n\ncomponents\030\002 \003(\01320.org.apache.slider." +
-      "api.ComponentInformationProto\",\n\034GetLive" +
-      "ComponentRequestProto\022\014\n\004name\030\001 \002(\t\"$\n\"G" +
-      "etApplicationLivenessRequestProto\"\023\n\021Emp" +
-      "tyPayloadProto\" \n\020WrappedJsonProto\022\014\n\004js" +
-      "on\030\001 \002(\t\"h\n\037GetCertificateStoreRequestPr" +
-      "oto\022\020\n\010hostname\030\001 \001(\t\022\023\n\013requesterId\030\002 \002",
-      "(\t\022\020\n\010password\030\003 \002(\t\022\014\n\004type\030\004 \002(\t\"1\n Ge" +
-      "tCertificateStoreResponseProto\022\r\n\005store\030" +
-      "\001 \002(\014\"\032\n\030GetLiveNodesRequestProto\"W\n\031Get" +
-      "LiveNodesResponseProto\022:\n\005nodes\030\001 \003(\0132+." +
-      "org.apache.slider.api.NodeInformationPro" +
-      "to\"\'\n\027GetLiveNodeRequestProto\022\014\n\004name\030\001 " +
-      "\002(\tB-\n\033org.apache.slider.api.protoB\010Mess" +
-      "ages\210\001\001\240\001\001"
+      "(\005\022\021\n\treleasing\030\t \002(\005\022\020\n\010lastUsed\030\n \002(\003\022" +
+      "\014\n\004name\030\013 \002(\t\"\334\001\n\024NodeInformationProto\022\020" +
+      "\n\010hostname\030\001 \002(\t\022\r\n\005state\030\002 \002(\t\022\023\n\013httpA" +
+      "ddress\030\003 \002(\t\022\020\n\010rackName\030\004 \002(\t\022\016\n\006labels" +
+      "\030\005 \002(\t\022\024\n\014healthReport\030\006 \002(\t\022\023\n\013lastUpda" +
+      "ted\030\007 \002(\003\022A\n\007entries\030\010 \003(\01320.org.apache." +
+      "slider.api.NodeEntryInformationProto\"\026\n\024",
+      "GetModelRequestProto\"\035\n\033GetModelDesiredR" +
+      "equestProto\"$\n\"GetModelDesiredAppconfReq" +
+      "uestProto\"&\n$GetModelDesiredResourcesReq" +
+      "uestProto\"%\n#GetModelResolvedAppconfRequ" +
+      "estProto\"\'\n%GetModelResolvedResourcesReq" +
+      "uestProto\"#\n!GetModelLiveResourcesReques" +
+      "tProto\"\037\n\035GetLiveContainersRequestProto\"" +
+      "u\n\036GetLiveContainersResponseProto\022\r\n\005nam" +
+      "es\030\001 \003(\t\022D\n\ncontainers\030\002 \003(\01320.org.apach" +
+      "e.slider.api.ContainerInformationProto\"3",
+      "\n\034GetLiveContainerRequestProto\022\023\n\013contai" +
+      "nerId\030\001 \002(\t\"\037\n\035GetLiveComponentsRequestP" +
+      "roto\"u\n\036GetLiveComponentsResponseProto\022\r" +
+      "\n\005names\030\001 \003(\t\022D\n\ncomponents\030\002 \003(\01320.org." +
+      "apache.slider.api.ComponentInformationPr" +
+      "oto\",\n\034GetLiveComponentRequestProto\022\014\n\004n" +
+      "ame\030\001 \002(\t\"$\n\"GetApplicationLivenessReque" +
+      "stProto\"\023\n\021EmptyPayloadProto\" \n\020WrappedJ" +
+      "sonProto\022\014\n\004json\030\001 \002(\t\"h\n\037GetCertificate" +
+      "StoreRequestProto\022\020\n\010hostname\030\001 \001(\t\022\023\n\013r",
+      "equesterId\030\002 \002(\t\022\020\n\010password\030\003 \002(\t\022\014\n\004ty" +
+      "pe\030\004 \002(\t\"1\n GetCertificateStoreResponseP" +
+      "roto\022\r\n\005store\030\001 \002(\014\"\032\n\030GetLiveNodesReque" +
+      "stProto\"W\n\031GetLiveNodesResponseProto\022:\n\005" +
+      "nodes\030\001 \003(\0132+.org.apache.slider.api.Node" +
+      "InformationProto\"\'\n\027GetLiveNodeRequestPr" +
+      "oto\022\014\n\004name\030\001 \002(\tB-\n\033org.apache.slider.a" +
+      "pi.protoB\010Messages\210\001\001\240\001\001"
     };
     com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
       new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -34154,7 +34327,7 @@ public final class Messages {
           internal_static_org_apache_slider_api_NodeEntryInformationProto_fieldAccessorTable = new
             com.google.protobuf.GeneratedMessage.FieldAccessorTable(
               internal_static_org_apache_slider_api_NodeEntryInformationProto_descriptor,
-              new java.lang.String[] { "Priority", "Requested", "Starting", "StartFailed", "Failed", "FailedRecently", "Preempted", "Live", "Releasing", "LastUsed", });
+              new java.lang.String[] { "Priority", "Requested", "Starting", "StartFailed", "Failed", "FailedRecently", "Preempted", "Live", "Releasing", "LastUsed", "Name", });
           internal_static_org_apache_slider_api_NodeInformationProto_descriptor =
             getDescriptor().getMessageTypes().get(28);
           internal_static_org_apache_slider_api_NodeInformationProto_fieldAccessorTable = new

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/main/java/org/apache/slider/api/proto/RestTypeMarshalling.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/api/proto/RestTypeMarshalling.java b/slider-core/src/main/java/org/apache/slider/api/proto/RestTypeMarshalling.java
index 8dcf65f..feebe1d 100644
--- a/slider-core/src/main/java/org/apache/slider/api/proto/RestTypeMarshalling.java
+++ b/slider-core/src/main/java/org/apache/slider/api/proto/RestTypeMarshalling.java
@@ -41,6 +41,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Class to handle marshalling of REST
@@ -152,33 +153,25 @@ public class RestTypeMarshalling {
         Messages.NodeInformationProto.newBuilder();
     builder.setHostname(info.hostname);
     builder.setLastUpdated(info.lastUpdated);
-    if (info.state != null) {
-      builder.setState(info.state);
-    }
-    if (info.rackName != null) {
-      builder.setRackName(info.rackName);
-    }
-    if (info.healthReport != null) {
-      builder.setHealthReport(info.healthReport);
-    }
-    if (info.httpAddress != null) {
-      builder.setHttpAddress(info.httpAddress);
-    }
-    if (info.labels != null) {
-      builder.setLabels(info.labels);
-    }
+    builder.setState(info.state != null? info.state : "unknown");
+    builder.setRackName(info.rackName != null ? info.rackName : "");
+    builder.setHealthReport(info.healthReport != null ? info.healthReport : "");
+    builder.setHttpAddress(info.httpAddress != null ? info.httpAddress : "");
+    builder.setLabels(info.labels != null ? info.labels: "");
+
 
     if (info.entries != null) {
-      Collection<NodeEntryInformation> entries = info.entries.values();
-      for (NodeEntryInformation entry : entries) {
+      for (Map.Entry<String, NodeEntryInformation> elt : info.entries.entrySet()) {
+        NodeEntryInformation entry = elt.getValue();
         Messages.NodeEntryInformationProto.Builder node =
             Messages.NodeEntryInformationProto.newBuilder();
+        node.setPriority(entry.priority);
+        node.setName(elt.getKey());
         node.setFailed(entry.failed);
         node.setFailedRecently(entry.failedRecently);
         node.setLive(entry.live);
         node.setLastUsed(entry.lastUsed);
         node.setPreempted(entry.preempted);
-        node.setPriority(entry.priority);
         node.setRequested(entry.requested);
         node.setReleasing(entry.releasing);
         node.setStartFailed(entry.startFailed);
@@ -213,7 +206,7 @@ public class RestTypeMarshalling {
         nei.releasing = entry.getReleasing();
         nei.startFailed = entry.getStartFailed();
         nei.starting = entry.getStarting();
-        info.entries.put(Integer.toString(nei.priority), nei);
+        info.entries.put(entry.getName(), nei);
       }
     }
     return info;

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/main/java/org/apache/slider/server/appmaster/state/AppState.java
----------------------------------------------------------------------
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 171cc42..4b4d7a7 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
@@ -2390,4 +2390,16 @@ public class AppState {
     return sb.toString();
   }
 
+  /**
+   * Build map of role ID-> name
+   * @return
+   */
+  public Map<Integer, String> buildNamingMap() {
+    Map<Integer, RoleStatus> statusMap = getRoleStatusMap();
+    Map<Integer, String> naming = new HashMap<>(statusMap.size());
+    for (Map.Entry<Integer, RoleStatus> entry : statusMap.entrySet()) {
+      naming.put(entry.getKey(), entry.getValue().getName());
+    }
+    return naming;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/main/java/org/apache/slider/server/appmaster/state/ProviderAppState.java
----------------------------------------------------------------------
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 f544c6a..c409114 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
@@ -37,7 +37,6 @@ import org.apache.slider.server.services.utility.PatternValidator;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -293,22 +292,13 @@ public class ProviderAppState implements StateAccessForProviders {
   @Override
   public Map<String, NodeInformation> getNodeInformationSnapshot() {
     return appState.getRoleHistory()
-      .getNodeInformationSnapshot(buildingNamingMap());
-  }
-
-  private Map<Integer, String> buildingNamingMap() {
-    Map<Integer, RoleStatus> statusMap = getRoleStatusMap();
-    Map<Integer, String> naming = new HashMap<>(statusMap.size());
-    for (Map.Entry<Integer, RoleStatus> entry : statusMap.entrySet()) {
-      naming.put(entry.getKey(), entry.getValue().getName());
-    }
-    return naming;
+      .getNodeInformationSnapshot(appState.buildNamingMap());
   }
 
   @Override
   public NodeInformation getNodeInformation(String hostname) {
-    return appState.getRoleHistory().getNodeInformation(hostname,
-      buildingNamingMap());
+    return appState.getRoleHistory()
+      .getNodeInformation(hostname, appState.buildNamingMap());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/main/proto/SliderClusterMessages.proto
----------------------------------------------------------------------
diff --git a/slider-core/src/main/proto/SliderClusterMessages.proto b/slider-core/src/main/proto/SliderClusterMessages.proto
index 9a4265c..b8bdc59 100644
--- a/slider-core/src/main/proto/SliderClusterMessages.proto
+++ b/slider-core/src/main/proto/SliderClusterMessages.proto
@@ -299,6 +299,7 @@ message NodeEntryInformationProto {
   required int32 live =          8;
   required int32 releasing =     9;
   required int64 lastUsed =     10;
+  required string name =        11;
 }
 
 message NodeInformationProto {

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAAPlacement.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAAPlacement.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAAPlacement.groovy
index f911515..16d0f87 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAAPlacement.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/appstate/TestMockAppStateAAPlacement.groovy
@@ -24,6 +24,7 @@ import org.apache.hadoop.yarn.api.records.Container
 import org.apache.hadoop.yarn.api.records.NodeState
 import org.apache.hadoop.yarn.client.api.AMRMClient
 import org.apache.slider.api.ResourceKeys
+import org.apache.slider.api.types.NodeInformationList
 import org.apache.slider.core.conf.ConfTreeOperations
 import org.apache.slider.providers.PlacementPolicy
 import org.apache.slider.server.appmaster.model.mock.MockAppState
@@ -310,4 +311,21 @@ class TestMockAppStateAAPlacement extends BaseMockAppStateAATest
     assert aaRole.antiAffinePlacement
     assert aaRole.AARequestOutstanding
   }
+
+  @Test
+  public void testNodeInstanceSerialization() throws Throwable {
+    def naming = appState.buildNamingMap()
+    assert naming.size() == 3
+
+    def name = aaRole.name
+    assert naming[aaRole.key] == name
+    def info = appState.roleHistory.getNodeInformationSnapshot(naming);
+    assert info
+
+    def host = "localhost"
+    assert info[host] && info[host]?.entries[name]?.live
+    def nil = new NodeInformationList(info.values());
+    assert nil[0].entries[name]?.live
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/77aeb253/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/history/TestRoleHistoryAA.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/history/TestRoleHistoryAA.groovy b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/history/TestRoleHistoryAA.groovy
index bf8d1b4..db84b0b 100644
--- a/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/history/TestRoleHistoryAA.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/server/appmaster/model/history/TestRoleHistoryAA.groovy
@@ -21,6 +21,10 @@ package org.apache.slider.server.appmaster.model.history
 import groovy.util.logging.Slf4j
 import org.apache.hadoop.yarn.api.records.NodeReport
 import org.apache.hadoop.yarn.api.records.NodeState
+import org.apache.slider.api.proto.Messages
+import org.apache.slider.api.proto.RestTypeMarshalling
+import org.apache.slider.api.types.NodeInformation
+import org.apache.slider.api.types.NodeInformationList
 import org.apache.slider.server.appmaster.model.mock.MockFactory
 import org.apache.slider.server.appmaster.model.mock.MockNodeReport
 import org.apache.slider.server.appmaster.model.mock.MockRoleHistory
@@ -184,6 +188,35 @@ class TestRoleHistoryAA extends SliderTestBase {
     assert entry.available
   }
 
+  @Test
+  public void testNodeInstanceSerialization() throws Throwable {
+    def rh2 = new MockRoleHistory([])
+    rh2.getOrCreateNodeInstance("localhost")
+    def instance = rh2.getOrCreateNodeInstance("localhost")
+    instance.getOrCreate(1).onStartCompleted()
+    def Map<Integer, String> naming = [(1):"manager"]
+    def ni = instance.serialize(naming)
+    assert 1 == ni.entries["manager"].live
+    def ni2 = rh2.getNodeInformation("localhost", naming)
+    assert 1 == ni2.entries["manager"].live
+    def info = rh2.getNodeInformationSnapshot(naming)
+    assert 1 == info["localhost"].entries["manager"].live
+    def nil = new NodeInformationList(info.values());
+    assert 1 == nil[0].entries["manager"].live
+
+    def nodeInformationProto = RestTypeMarshalling.marshall(ni)
+    def entryProto = nodeInformationProto.getEntries(0)
+    assert entryProto && entryProto.getPriority() == 1
+    def unmarshalled = RestTypeMarshalling.unmarshall(nodeInformationProto)
+    assert unmarshalled.hostname == ni.hostname
+    assert unmarshalled.entries.keySet().containsAll(ni.entries.keySet())
+
+  }
+
+  @Test
+  public void testBuildRolenames() throws Throwable {
+
+  }
   public List<NodeInstance> assertNoAvailableNodes(int role = 1, String label = "") {
     return verifyResultSize(0, nodeMap.findAllNodesForRole(role, label))
   }