Add "Optimization type" support on Network

Change-Id: I3ade07cd774fcf73104a799f40743730ddd56b57
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
index 9437d4a1..d0b2c3c 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
@@ -17,6 +17,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
 
 import java.util.List;
 import java.util.Map;
@@ -518,7 +519,9 @@
         org.onosproject.tetopology.management.api.DefaultNetwork network =
                 new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
                                                                              teNodes, teLinks, teTopologyId,
-                                                                             serverProvided, deviceId);
+                                                                             serverProvided,
+                                                                             deviceId,
+                                                                             NOT_OPTIMIZED);
         return network;
     }
 
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/DefaultNetwork.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/DefaultNetwork.java
index faa35e1..df3dbd5 100644
--- a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/DefaultNetwork.java
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/DefaultNetwork.java
@@ -15,18 +15,19 @@
  */
 package org.onosproject.tetopology.management.api;
 
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.node.NetworkNode;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.onosproject.net.DeviceId;
-import org.onosproject.tetopology.management.api.link.NetworkLink;
-import org.onosproject.tetopology.management.api.node.NetworkNode;
-
-import java.util.List;
-import java.util.Map;
 
 /**
  * Default Network implementation.
@@ -39,22 +40,24 @@
     private final TeTopologyId teTopologyId;
     private final boolean serverProvided;
     private final DeviceId ownerId;
+    private final OptimizationType optimization;
 
     /**
      * Creates an instance of DefaultNetwork.
      *
-     * @param networkId            network identifier
+     * @param networkId network identifier
      * @param supportingNetworkIds supporting network identifier
-     * @param nodes                list of nodes within the network
-     * @param links                list of links within the network
-     * @param teTopologyId         TE topology identifier
-     * @param serverProvided       whether the network is received from server
-     * @param ownerId              the the controller identifier owning this topology
+     * @param nodes list of nodes within the network
+     * @param links list of links within the network
+     * @param teTopologyId TE topology identifier associated with the network
+     * @param serverProvided whether the network is received from server
+     * @param ownerId the the controller identifier owning this topology
+     * @param optimization TE topology optimization criteria
      */
     public DefaultNetwork(KeyId networkId, List<KeyId> supportingNetworkIds,
                           Map<KeyId, NetworkNode> nodes, Map<KeyId, NetworkLink> links,
                           TeTopologyId teTopologyId, boolean serverProvided,
-                          DeviceId ownerId) {
+                          DeviceId ownerId, OptimizationType optimization) {
         this.networkId = networkId;
         this.supportingNetworkIds = supportingNetworkIds != null ?
                 Lists.newArrayList(supportingNetworkIds) : null;
@@ -63,6 +66,7 @@
         this.teTopologyId = teTopologyId;
         this.serverProvided = serverProvided;
         this.ownerId = ownerId;
+        this.optimization = optimization;
     }
 
 
@@ -121,9 +125,15 @@
     }
 
     @Override
+    public OptimizationType optimization() {
+        return optimization;
+    }
+
+    @Override
     public int hashCode() {
         return Objects.hashCode(networkId, supportingNetworkIds,
-                                nodes, links, serverProvided, teTopologyId, ownerId);
+                                nodes, links, serverProvided, teTopologyId,
+                                ownerId, optimization);
     }
 
     @Override
@@ -139,7 +149,8 @@
                     Objects.equal(links, that.links) &&
                     Objects.equal(serverProvided, that.serverProvided) &&
                     Objects.equal(teTopologyId, that.teTopologyId) &&
-                    Objects.equal(ownerId, that.ownerId);
+                    Objects.equal(ownerId, that.ownerId)
+                    && Objects.equal(optimization, that.optimization);
         }
         return false;
     }
@@ -154,6 +165,8 @@
                 .add("serverProvided", serverProvided)
                 .add("teTopologyId", teTopologyId)
                 .add("ownerId", ownerId)
+                .add("optimization", optimization)
                 .toString();
     }
+
 }
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/Network.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/Network.java
index 389ff46..4464c4e 100644
--- a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/Network.java
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/Network.java
@@ -94,6 +94,13 @@
     TeTopologyId teTopologyId();
 
     /**
+     * Returns the topology optimization criteria.
+     *
+     * @return the optimization
+     */
+    OptimizationType optimization();
+
+    /**
      * Returns the controller identifier owning this abstracted topology.
      *
      * @return the controller id
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
index ecfb25c..60fd0d5 100644
--- a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.tetopology.management.impl;
 
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
@@ -752,20 +753,19 @@
         }
         TeTopologyId topologyId = null;
         DeviceId ownerId = null;
+        OptimizationType opt = NOT_OPTIMIZED;
         if (curNetwork.teTopologyKey() != null &&
                 teTopologyMap.get(curNetwork.teTopologyKey()) != null) {
             topologyId = new TeTopologyId(curNetwork.teTopologyKey().providerId(),
                                           curNetwork.teTopologyKey().clientId(),
-                                          teTopologyMap
-                                                  .get(curNetwork
-                                                          .teTopologyKey())
+                                          teTopologyMap.get(curNetwork.teTopologyKey())
                                                   .teTopologyId());
             ownerId = teTopologyMap.get(curNetwork.teTopologyKey())
                     .topologyData().ownerId();
-
+            opt = teTopologyMap.get(curNetwork.teTopologyKey()).topologyData().optimization();
         }
         return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
-                                  topologyId, curNetwork.serverProvided(), ownerId);
+                                  topologyId, curNetwork.serverProvided(), ownerId, opt);
     }
 
     @Override
@@ -851,7 +851,9 @@
                 flags.set(TeTopology.BIT_CUSTOMIZED);
             }
             CommonTopologyData common = new CommonTopologyData(network.networkId(),
-                    OptimizationType.NOT_OPTIMIZED, flags, network.ownerId());
+                                                               network.optimization(),
+                                                               flags,
+                                                               network.ownerId());
             intTopo.setTopologydata(common);
             teTopologyMap.put(topoKey, intTopo);
         }
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java
index dc4c165..c2b9b39 100644
--- a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeMgrUtil.java
@@ -229,7 +229,8 @@
             }
         }
         return new DefaultNetwork(networkId, null, nodes, links,
-                                  topologyId, false, teTopology.ownerId());
+                                  topologyId, false, teTopology.ownerId(),
+                                  teTopology.optimization());
     }
 
 }
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
index 30ca4e2..69a8f2d 100644
--- a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
@@ -391,8 +391,9 @@
                         break;
                     case NETWORK_REMOVED:
                         post(new TeTopologyEvent(NETWORK_REMOVED,
-                                                 new DefaultNetwork(event.networkKey(),
-                                                                    null, null, null, null, false, null)));
+                                                 new DefaultNetwork(event.networkKey(), null, null,
+                                                                    null, null, false, null,
+                                                                    NOT_OPTIMIZED)));
                         break;
                     case NODE_ADDED:
                     case NODE_UPDATED:
diff --git a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/DefaultBuilder.java b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/DefaultBuilder.java
index 9ed72ba..c92bbc7 100644
--- a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/DefaultBuilder.java
+++ b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/DefaultBuilder.java
@@ -25,6 +25,7 @@
 import org.onosproject.tetopology.management.api.EncodingType;
 import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.Network;
+import org.onosproject.tetopology.management.api.OptimizationType;
 import org.onosproject.tetopology.management.api.SwitchingType;
 import org.onosproject.tetopology.management.api.TeConstants;
 import org.onosproject.tetopology.management.api.TeStatus;
@@ -253,15 +254,18 @@
     }
 
     private static Network networkBuilder(TeTopologyId teTopologyId, KeyId supportingNetworkId,
-                                         Map<KeyId, NetworkNode> nodes, Map<KeyId, NetworkLink> links,
-                                         boolean serverProvided, DeviceId ownerId) {
+                                          Map<KeyId, NetworkNode> nodes,
+                                          Map<KeyId, NetworkLink> links,
+                                          boolean serverProvided,
+                                          DeviceId ownerId,
+                                          OptimizationType optType) {
         KeyId networkId = TeMgrUtil.toNetworkId(teTopologyId);
         List<KeyId> supportingNetworkIds = null;
         if (supportingNetworkId != null) {
             supportingNetworkIds = Lists.newArrayList(supportingNetworkId);
         }
         return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links, teTopologyId,
-                              serverProvided, ownerId);
+                                  serverProvided, ownerId, optType);
     }
 
     /**
@@ -318,10 +322,10 @@
                                   ODU4);
         links.put(networkLink.linkId(), networkLink);
         DeviceId ownerId = DeviceId.deviceId(DOMAIN_ID);
-        TeTopologyId topologyId = new TeTopologyId(PROVIDER_ID, CLIENT_ID, Long
-                .toString(ABSTRACT_TOPOLOGY_ID));
+        TeTopologyId topologyId = new TeTopologyId(PROVIDER_ID, CLIENT_ID,
+                                                   Long.toString(ABSTRACT_TOPOLOGY_ID));
         network = networkBuilder(topologyId, null, nodes, links, false,
-                                 ownerId);
+                                 ownerId, OptimizationType.NOT_OPTIMIZED);
         return network;
     }
 
diff --git a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
index f4ff72d..e313369 100644
--- a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
+++ b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.tetopology.management;
 
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
 import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
@@ -297,6 +298,7 @@
         }
         TeTopologyId topologyId = null;
         DeviceId ownerId = null;
+        OptimizationType opt = NOT_OPTIMIZED;
         if (curNetwork.teTopologyKey() != null
                 && teTopology(curNetwork.teTopologyKey()) != null) {
             topologyId = new TeTopologyId(curNetwork.teTopologyKey()
@@ -304,11 +306,12 @@
                                           teTopology(curNetwork.teTopologyKey())
                                                   .teTopologyIdStringValue());
             ownerId = teTopology(curNetwork.teTopologyKey()).ownerId();
-
+            opt = teTopologyMap.get(curNetwork.teTopologyKey()).topologyData()
+                    .optimization();
         }
         return new DefaultNetwork(networkId, supportingNetworkIds, nodes, links,
                                   topologyId, curNetwork.serverProvided(),
-                                  ownerId);
+                                  ownerId, opt);
     }
 
     @Override
@@ -408,9 +411,8 @@
                 // Hard rule for now
                 flags.set(TeTopology.BIT_CUSTOMIZED);
             }
-            CommonTopologyData common = new CommonTopologyData(network
-                    .networkId(), OptimizationType.NOT_OPTIMIZED, flags, network
-                            .ownerId());
+            CommonTopologyData common = new CommonTopologyData(network.networkId(), NOT_OPTIMIZED,
+                                                               flags, network.ownerId());
             intTopo.setTopologydata(common);
             teTopologyMap.put(topoKey, intTopo);
             // Assume new topology
@@ -424,8 +426,7 @@
         networkMap.put(network.networkId(), newNetwork);
         // Assume new network
         TeTopologyEvent topologyEvent = new TeTopologyEvent(NETWORK_ADDED,
-                                                            network(network
-                                                                    .networkId()));
+                                                            network(network.networkId()));
         notifyDelegate(topologyEvent);
     }
 
@@ -440,7 +441,8 @@
                                                                                null,
                                                                                null,
                                                                                false,
-                                                                               null));
+                                                                               null,
+                                                                               NOT_OPTIMIZED));
         notifyDelegate(topologyEvent);
         if (network != null && network.teTopologyKey() != null) {
             removeNetworkMapEntrys(network, false);