reconstruct post body in NB

Change-Id: I6653df3bb7eb56906f2fe2590d7e36054109a4a1
diff --git a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
index 8814a1b..9f420b1 100644
--- a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
@@ -93,7 +93,7 @@
         List<Tunnel> tunnels = new ArrayList<>();
         Collection<TeTunnel> teTunnels = tunnelService.getTeTunnels();
         teTunnels.forEach(teTunnel -> {
-            Tunnel tunnel = te2YangTunnelConverter(teTunnel);
+            Tunnel tunnel = te2YangTunnelConverter(teTunnel, false);
             tunnels.add(tunnel);
         });
         IetfTe newIetfTe = buildIetfTeWithTunnels(tunnels);
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/tunnel/TunnelConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/tunnel/TunnelConverter.java
index e82ee64..733a249 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/tunnel/TunnelConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/tunnel/TunnelConverter.java
@@ -32,37 +32,27 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.DefaultTe;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.Te;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.Type;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type
-        .DefaultDynamic;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type
-        .DefaultExplicit;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type
-        .explicit.DefaultExplicitRouteObjects;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type
-        .explicit.ExplicitRouteObjects;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.DefaultDynamic;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.DefaultExplicit;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.DefaultExplicitRouteObjects;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.pathparamsconfig.type.explicit.ExplicitRouteObjects;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties
-        .DefaultPrimaryPaths;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultPrimaryPaths;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.DefaultState;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.PrimaryPaths;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping
-        .DefaultTunnels;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.DefaultTunnels;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.Tunnels;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels
-        .DefaultTunnel;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels
-        .Tunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.DefaultTunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelsgrouping.tunnels.Tunnel;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProt1Forn;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtBidir1To1;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtReroute;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .LspProtRerouteExtra;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtRerouteExtra;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtUnidir1To1;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.LspProtUnprotected;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .PathSignalingRsvpte;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.PathSignalingRsvpte;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.PathSignalingSr;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.RouteIncludeEro;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.StateDown;
@@ -70,15 +60,15 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TunnelP2Mp;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TunnelP2p;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TunnelType;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .explicitroutesubobject.type.DefaultUnnumberedLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .explicitroutesubobject.type.UnnumberedLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.packet.ONOSLLDP.DEFAULT_NAME;
 import static org.onosproject.tetunnel.api.tunnel.TeTunnel.LspProtectionType;
 import static org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject.Type.UNNUMBERED_LINK;
 import static org.onosproject.teyang.utils.tunnel.BasicConverter.bytesToLong;
@@ -128,8 +118,8 @@
                 .build();
     }
 
-    public static IetfTe buildIetfTe(TeTunnel teTunnel) {
-        Tunnel tunnel = te2YangTunnelConverter(teTunnel);
+    public static IetfTe buildIetfTe(TeTunnel teTunnel, boolean isConfig) {
+        Tunnel tunnel = te2YangTunnelConverter(teTunnel, isConfig);
         return buildIetfTeWithTunnels(Lists.newArrayList(tunnel));
     }
 
@@ -138,28 +128,38 @@
      * defined in YANG model.
      *
      * @param tunnel te tunnel defined in APP
+     * @param isConfig true if tunnel is to be built with config attributes;
+     *                 false if built with state attributes
      * @return tunnel defined in YANG model
      */
-    public static Tunnel te2YangTunnelConverter(TeTunnel tunnel) {
+    public static Tunnel te2YangTunnelConverter(TeTunnel tunnel, boolean isConfig) {
         List<PrimaryPaths> pathsList = new ArrayList<>();
-        //TODO add path info after yang tool change to guava from google-collect
+
+        if (tunnel.primaryPaths() != null) {
+            tunnel.primaryPaths()
+                    .forEach(tePath -> pathsList.add(te2YangPrimaryPath(tePath)));
+        }
+
         tunnel.primaryPaths()
                 .forEach(tePath -> pathsList.add(te2YangPrimaryPath(tePath)));
 
         Tunnel.TunnelBuilder builder = new DefaultTunnel
                 .TunnelBuilder()
                 .type(te2YangTunnelType(tunnel.type()))
-                .name(tunnel.name())
+                .name(validName(tunnel.name()))
                 .identifier(tunnel.teTunnelKey().teTunnelId())
                 .state(te2YangTunnelState(tunnel))
                 .primaryPaths(pathsList);
+        Tunnel.TunnelBuilder tunnelBuilder = isConfig ?
+                builder.config(te2YangTunnelConfig(tunnel)) :
+                builder.state(te2YangTunnelState(tunnel));
 
-        return builder.build();
+        return tunnelBuilder.build();
     }
 
     private static State te2YangTunnelState(TeTunnel tunnel) {
         State.StateBuilder stateBuilder = new DefaultState.StateBuilder();
-        stateBuilder.name(tunnel.name())
+        stateBuilder.name(validName(tunnel.name()))
                 .identifier((int) tunnel.teTunnelKey().teTunnelId())
                 .source((longToIp(tunnel.srcNode().teNodeId())))
                 .destination((longToIp(tunnel.dstNode().teNodeId())))
@@ -173,6 +173,33 @@
         return stateBuilder.build();
     }
 
+    private static Config te2YangTunnelConfig(TeTunnel tunnel) {
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
+                rev20160705.ietfte.tunnelproperties.DefaultConfig.ConfigBuilder
+                configBuilder = new org.onosproject.yang.gen.v1.urn.ietf.params.
+                xml.ns.yang.ietf.te.rev20160705.ietfte.tunnelproperties.
+                DefaultConfig.ConfigBuilder();
+
+        configBuilder.name(validName(tunnel.name()))
+                .identifier((int) tunnel.teTunnelKey().teTunnelId())
+                .source((longToIp(tunnel.srcNode().teNodeId())))
+                .destination((longToIp(tunnel.dstNode().teNodeId())))
+                .srcTpId(longToByte(tunnel.srcTp().ttpId()))
+                .dstTpId(longToByte(tunnel.dstTp().ttpId()))
+                .adminStatus(te2YangStateType(tunnel.adminStatus()))
+                .lspProtectionType(
+                        te2YangProtectionType(tunnel.lspProtectionType()))
+                .type(te2YangTunnelType(tunnel.type()))
+                .build();
+        return configBuilder.build();
+    }
+
+    private static String validName(String name) {
+        //for name is a required attribute, here we give a default name if not
+        //configured
+        return isNullOrEmpty(name) ? DEFAULT_NAME : name;
+    }
+
     private static PrimaryPaths te2YangPrimaryPath(TePath tePath) {
         DefaultPrimaryPaths.PrimaryPathsBuilder builder = new DefaultPrimaryPaths
                 .PrimaryPathsBuilder()
diff --git a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
index 1d9468d..7eae7e1 100644
--- a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
+++ b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
@@ -216,7 +216,7 @@
             return;
         }
 
-        IetfTe ietfTe = buildIetfTe(optTunnel.get());
+        IetfTe ietfTe = buildIetfTe(optTunnel.get(), true);
 
         YangCompositeEncoding encoding = codecHandler.
                 encodeCompositeOperation(RESTCONF_ROOT, null, ietfTe,