ONOS-5454 [TE Tunnel NBI ] Interact with tetunnel APP to provide CRUD interfaces for RESTconf request

Change-Id: I5b2dad9d65c72cb9adc7f313272319ea8046a6a8
diff --git a/apps/tenbi/tunnel/app.xml b/apps/tenbi/tunnel/app.xml
new file mode 100755
index 0000000..78997d3
--- /dev/null
+++ b/apps/tenbi/tunnel/app.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ /*
+  ~  * Copyright 2016-present Open Networking Laboratory
+  ~  *
+  ~  * Licensed under the Apache License, Version 2.0 (the "License");
+  ~  * you may not use this file except in compliance with the License.
+  ~  * You may obtain a copy of the License at
+  ~  *
+  ~  *     http://www.apache.org/licenses/LICENSE-2.0
+  ~  *
+  ~  * Unless required by applicable law or agreed to in writing, software
+  ~  * distributed under the License is distributed on an "AS IS" BASIS,
+  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  * See the License for the specific language governing permissions and
+  ~  * limitations under the License.
+  ~  */
+  -->
+<app name="org.onosproject.tenbi.tunnel" origin="HUAWEI" version="${project.version}"
+     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
+     features="${project.artifactId}">
+    <description>${project.description}</description>
+    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
+    <artifact>mvn:${project.groupId}/onos-app-tenbi-yangmodel/${project.version}</artifact>
+</app>
+
diff --git a/apps/tenbi/tunnel/features.xml b/apps/tenbi/tunnel/features.xml
new file mode 100755
index 0000000..9610045
--- /dev/null
+++ b/apps/tenbi/tunnel/features.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ /*
+  ~  * Copyright 2016-present Open Networking Laboratory
+  ~  *
+  ~  * Licensed under the Apache License, Version 2.0 (the "License");
+  ~  * you may not use this file except in compliance with the License.
+  ~  * You may obtain a copy of the License at
+  ~  *
+  ~  *     http://www.apache.org/licenses/LICENSE-2.0
+  ~  *
+  ~  * Unless required by applicable law or agreed to in writing, software
+  ~  * distributed under the License is distributed on an "AS IS" BASIS,
+  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  * See the License for the specific language governing permissions and
+  ~  * limitations under the License.
+  ~  */
+  -->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
+    <repository>mvn:${project.groupId}/onos-app-tenbi-yangmodel/${project.version}/xml/features</repository>
+    <feature name="${project.artifactId}" version="${project.version}" description="${project.description}">
+        <feature>onos-api</feature>
+        <feature>onos-app-tenbi-yangmodel</feature>
+        <bundle>mvn:${project.groupId}/onos-app-tetopology-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-yms-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-tetunnel-api/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/onos-app-tenbi-utils/${project.version}</bundle>
+        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
+    </feature>
+</features>
diff --git a/apps/tenbi/tunnel/pom.xml b/apps/tenbi/tunnel/pom.xml
new file mode 100755
index 0000000..23f761f
--- /dev/null
+++ b/apps/tenbi/tunnel/pom.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ /*
+  ~  * Copyright 2016-present Open Networking Laboratory
+  ~  *
+  ~  * Licensed under the Apache License, Version 2.0 (the "License");
+  ~  * you may not use this file except in compliance with the License.
+  ~  * You may obtain a copy of the License at
+  ~  *
+  ~  *     http://www.apache.org/licenses/LICENSE-2.0
+  ~  *
+  ~  * Unless required by applicable law or agreed to in writing, software
+  ~  * distributed under the License is distributed on an "AS IS" BASIS,
+  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  * See the License for the specific language governing permissions and
+  ~  * limitations under the License.
+  ~  */
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>onos-app-tenbi</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.8.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>onos-app-tenbi-tunnel</artifactId>
+    <packaging>bundle</packaging>
+    <description>IETF TE Tunnel NBI</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tenbi-yangmodel</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tenbi-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tetunnel-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-tetopology-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>3.2.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Private-Package>
+                            org.onosproject.yang.gen.*,
+                            org.onosproject.teyang.*,
+                            <!--org.onosproject.tetopology.management.api.*,-->
+                        </Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
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
new file mode 100755
index 0000000..38bd667
--- /dev/null
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.tenbi.tunnel;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.event.AbstractListenerManager;
+import org.onosproject.tetopology.management.api.TeTopology;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetunnel.api.TeTunnelAdminService;
+import org.onosproject.tetunnel.api.TeTunnelService;
+import org.onosproject.tetunnel.api.tunnel.DefaultTeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnel;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.IetfTeEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.ietfte.IetfTeEventListener;
+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;
+import org.onosproject.yms.ymsm.YmsService;
+import org.slf4j.Logger;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.tetopology.management.api.TeTopology.BIT_MERGED;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.buildIetfTeWithTunnels;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.te2YangTunnelConverter;
+import static org.onosproject.teyang.utils.tunnel.TunnelConverter.yang2TeTunnel;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * The IETF TE Tunnel NBI Manager implementation.
+ */
+@Component(immediate = true)
+@Service
+public class TeTunnelNbiManager
+        extends AbstractListenerManager<IetfTeEvent, IetfTeEventListener>
+        implements IetfTeService {
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected YmsService ymsService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTunnelService tunnelService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTopologyService toplogyService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected TeTunnelAdminService tunnelAdminService;
+
+    @Activate
+    protected void activate() {
+        ymsService.registerService(this, IetfTeService.class, null);
+        ymsService.registerService(this, IetfTeTypes.class, null);
+        log.info("started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        ymsService.unRegisterService(this, IetfTeService.class);
+        ymsService.unRegisterService(this, IetfTeTypes.class);
+        log.info("stopped");
+    }
+
+    @Override
+    public IetfTe getIetfTe(IetfTeOpParam ietfTe) {
+        List<Tunnel> tunnels = new ArrayList<>();
+        Collection<TeTunnel> teTunnels = tunnelService.getTeTunnels();
+        teTunnels.forEach(teTunnel -> {
+            Tunnel tunnel = te2YangTunnelConverter(teTunnel);
+            tunnels.add(tunnel);
+        });
+        IetfTe newIetfTe = buildIetfTeWithTunnels(tunnels);
+        return ietfTe.processSubtreeFiltering(newIetfTe, false);
+    }
+
+    @Override
+    public void setIetfTe(IetfTeOpParam ietfTe) {
+        checkNotNull(ietfTe, "Ietf te params should not be null");
+        //FIXME use topology id configured by user
+        // for there is no topology id param in the definition of te tunnel
+        // we use the merged topology id as the default topology where we create
+        // the tunnel, need to talk with the ietf-te draft writer.
+        TeTopologyKey topologyKey = getTopologyKey();
+        if (topologyKey == null) {
+            log.error("No usable topology now!");
+            return;
+        }
+
+        ietfTe.te().tunnels().tunnel().forEach(tunnel -> {
+            DefaultTeTunnel teTunnel = yang2TeTunnel(tunnel, topologyKey);
+            tunnelAdminService.createTeTunnel(teTunnel);
+        });
+    }
+
+    @Override
+    public void globalsRpc() {
+
+    }
+
+    @Override
+    public void interfacesRpc() {
+
+    }
+
+    @Override
+    public void tunnelsRpc() {
+        //TODO add implement for the te tunnel rpc
+    }
+
+    private TeTopologyKey getTopologyKey() {
+        TeTopologyKey key = null;
+        Optional<TeTopology> teTopology = toplogyService
+                .teTopologies()
+                .teTopologies()
+                .values()
+                .stream()
+                .filter(topology -> topology.flags().get(BIT_MERGED))
+                .findFirst();
+        if (teTopology.isPresent()) {
+            TeTopology topology = teTopology.get();
+            key = topology.teTopologyId();
+        }
+        return key;
+    }
+}
diff --git a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java
new file mode 100755
index 0000000..e9a797c
--- /dev/null
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The implementations of IETF TE Tunnel YANG NBI.
+ */
+package org.onosproject.tenbi.tunnel;
\ No newline at end of file
diff --git a/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java b/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java
new file mode 100644
index 0000000..944fd03
--- /dev/null
+++ b/apps/tenbi/tunnel/src/test/org/onosproject/tenbi/tunnel/TeTunnelNbiManagerTest.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.tenbi.tunnel;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.incubator.net.tunnel.TunnelId;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TtpKey;
+import org.onosproject.tetunnel.api.TeTunnelAdminService;
+import org.onosproject.tetunnel.api.TeTunnelService;
+import org.onosproject.tetunnel.api.lsp.TeLsp;
+import org.onosproject.tetunnel.api.lsp.TeLspKey;
+import org.onosproject.tetunnel.api.tunnel.DefaultTeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnel;
+import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
+import org.onosproject.tetunnel.api.tunnel.path.DefaultTePath;
+import org.onosproject.tetunnel.api.tunnel.path.DefaultTeRouteUnnumberedLink;
+import org.onosproject.tetunnel.api.tunnel.path.TePath;
+import org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.IpAddress;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.rev20160705.IetfTeOpParam;
+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.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.DefaultConfig;
+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.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.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.types.rev20160705.ietftetypes.LspProtUnprotected;
+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.StateUp;
+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.explicitroutesubobject.type.DefaultUnnumberedLink;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.tetunnel.api.tunnel.TeTunnel.LspProtectionType.LSP_PROT_REROUTE;
+import static org.onosproject.tetunnel.api.tunnel.TeTunnel.Type.P2P;
+import static org.onosproject.tetunnel.api.tunnel.path.TeRouteSubobject.Type.UNNUMBERED_LINK;
+
+/**
+ * Unit tests for TeTunnelNbiManager.
+ */
+public class TeTunnelNbiManagerTest {
+    private static final String TE_REQ_FAILED = "IETF TE reqeust failed: ";
+    private static final String NAME = "testTunnel";
+    private IpAddress srcIp = IpAddress.fromString("1.1.1.1");
+    private IpAddress dstIp = IpAddress.fromString("2.2.2.2");
+    private byte[] bytes1 = new byte[]{1, 1, 1, 1, 0, 0, 0, 0};
+    private byte[] bytes2 = new byte[]{2, 2, 2, 2, 0, 0, 0, 0};
+    private long id1 = 16843009;
+    private long id2 = 33686018;
+
+
+    private TeTunnelNbiManager manager;
+    private TeTunnel testTeTunnel;
+
+
+    @Before
+    public void setUp() throws Exception {
+        manager = new TeTunnelNbiManager();
+    }
+
+    @Test
+    public void getIetfTe() throws Exception {
+        TeTunnelService tunnelService = createMock(TeTunnelService.class);
+        expect(tunnelService.getTeTunnels())
+                .andReturn(ImmutableList.of(buildTunnel()))
+                .once();
+        replay(tunnelService);
+
+        manager.tunnelService = tunnelService;
+
+        IetfTe ietfTe = manager.getIetfTe((IetfTeOpParam) buildGetIetfTeParams());
+
+        assertNotNull(TE_REQ_FAILED + "te null", ietfTe.te());
+        assertNotNull(TE_REQ_FAILED + "tunnel null", ietfTe.te().tunnels());
+
+        List<Tunnel> tunnelList = ietfTe.te().tunnels().tunnel();
+        assertEquals(TE_REQ_FAILED + "wrong tunnel size", 1, tunnelList.size());
+
+        Tunnel tunnel = tunnelList.get(0);
+        List<PrimaryPaths> pathsList = tunnel.primaryPaths();
+        assertNotNull(TE_REQ_FAILED + "path null", pathsList);
+        assertEquals(TE_REQ_FAILED + "wrong path size", 1, pathsList.size());
+
+        Type type = pathsList.get(0).state().type();
+        assertTrue(TE_REQ_FAILED + "wrong path type",
+                   type instanceof DefaultExplicit);
+        DefaultExplicit explicitPath = (DefaultExplicit) type;
+        List<ExplicitRouteObjects> routeObjectses =
+                explicitPath.explicitRouteObjects();
+        assertEquals(TE_REQ_FAILED + "wrong route size", 2, routeObjectses.size());
+
+        ExplicitRouteObjects routeObjects = routeObjectses.get(1);
+        assertTrue(TE_REQ_FAILED + "wrong route object type",
+                   routeObjects.type() instanceof DefaultUnnumberedLink);
+
+        DefaultUnnumberedLink link = (DefaultUnnumberedLink) routeObjects.type();
+        assertEquals(TE_REQ_FAILED + "wrong route id",
+                     IpAddress.fromString("0.0.0.2"), link.routerId());
+        assertEquals(TE_REQ_FAILED + "wrong interface id", 2, link.interfaceId());
+
+        State state = tunnel.state();
+        assertEquals(TE_REQ_FAILED + "wrong state",
+                     StateUp.class, state.adminStatus());
+        assertEquals(TE_REQ_FAILED + "wrong source",
+                     IpAddress.fromString("0.0.0.1"), state.source());
+    }
+
+    @Test
+    public void setIetfTe() throws Exception {
+        manager.tunnelAdminService = new TestTunnelAdmin();
+        manager.setIetfTe((IetfTeOpParam) buildPostIetfTeParams());
+        assertEquals(NAME, testTeTunnel.name());
+        List<TePath> tePaths = testTeTunnel.primaryPaths();
+        assertEquals(1, tePaths.size());
+        TePath tePath = tePaths.get(0);
+        List<TeRouteSubobject> teRouteSubobjects = tePath.explicitRoute();
+        assertEquals(2, teRouteSubobjects.size());
+        TeRouteSubobject routeSubobject = teRouteSubobjects.get(1);
+        assertEquals(UNNUMBERED_LINK, routeSubobject.type());
+        DefaultTeRouteUnnumberedLink link =
+                (DefaultTeRouteUnnumberedLink) routeSubobject;
+        assertEquals(id2, link.node().teNodeId());
+        assertEquals(id2, link.ttp().ttpId());
+
+    }
+
+    private IetfTe buildGetIetfTeParams() {
+        Te te = new DefaultTe
+                .TeBuilder()
+                .yangTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+        return new IetfTeOpParam
+                .IetfTeBuilder()
+                .te(te)
+                .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+    }
+
+    private IetfTe buildPostIetfTeParams() {
+        Tunnel tunnel = buildYangTunnel();
+        Tunnels teTunnels = new DefaultTunnels
+                .TunnelsBuilder()
+                .tunnel(Lists.newArrayList(tunnel))
+                .build();
+        Te te = new DefaultTe
+                .TeBuilder()
+                .tunnels(teTunnels)
+                .yangTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+        return new IetfTeOpParam
+                .IetfTeBuilder()
+                .te(te)
+                .yangIetfTeOpType(IetfTe.OnosYangOpType.NONE)
+                .build();
+    }
+
+    private Tunnel buildYangTunnel() {
+        TeTunnel teTunnel = buildTunnel();
+        checkNotNull(teTunnel);
+        Config config = new DefaultConfig.ConfigBuilder()
+                .name(NAME)
+                .adminStatus(StateUp.class)
+                .source(srcIp)
+                .destination(dstIp)
+                .srcTpId(bytes1)
+                .dstTpId(bytes2)
+                .type(TunnelP2p.class)
+                .lspProtectionType(LspProtUnprotected.class)
+                .build();
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
+                rev20160705.ietftetypes.explicitroutesubobject.type.
+                UnnumberedLink yangLink1 = DefaultUnnumberedLink.builder()
+                .routerId(srcIp)
+                .interfaceId(id1)
+                .build();
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.
+                rev20160705.ietftetypes.explicitroutesubobject.type.
+                UnnumberedLink yangLink2 = DefaultUnnumberedLink.builder()
+                .routerId(dstIp)
+                .interfaceId(id2)
+                .build();
+
+        ExplicitRouteObjects routeObject1 = DefaultExplicitRouteObjects.builder()
+                .type(yangLink1)
+                .explicitRouteUsage(RouteIncludeEro.class)
+                .build();
+
+        ExplicitRouteObjects routeObject2 = DefaultExplicitRouteObjects.builder()
+                .type(yangLink2)
+                .explicitRouteUsage(RouteIncludeEro.class)
+                .build();
+
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
+                rev20160705.ietfte.pathparamsconfig.type.Explicit explicit
+                = DefaultExplicit.builder()
+                .explicitRouteObjects(ImmutableList.of(routeObject1, routeObject2))
+                .build();
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.
+                rev20160705.ietfte.p2pprimarypathparams.Config pathConfig
+                = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.
+                te.rev20160705.ietfte.p2pprimarypathparams.DefaultConfig.builder()
+                .pathNamedConstraint("onlyPath")
+                .lockdown(true)
+                .noCspf(true)
+                .type(explicit)
+                .build();
+
+        PrimaryPaths primaryPaths = DefaultPrimaryPaths.builder()
+                .config(pathConfig).build();
+
+        return DefaultTunnel.builder()
+                .name(config.name())
+                .type(config.type())
+                .config(config)
+                .primaryPaths(Lists.newArrayList(primaryPaths))
+                .build();
+    }
+
+    private TeTunnel buildTunnel() {
+        TeTopologyKey topologyKey = new TeTopologyKey(1, 2, 3);
+        TeTunnelKey teTunnelKey = new TeTunnelKey(topologyKey, 1);
+
+        TeNodeKey srcNodeKey = new TeNodeKey(topologyKey, 1);
+        TeNodeKey dstNodeKey = new TeNodeKey(topologyKey, 2);
+
+        TtpKey srcTtpKey = new TtpKey(srcNodeKey, 1);
+        TtpKey dstTtpKey = new TtpKey(srcNodeKey, 2);
+
+        TeLspKey lspKey = new TeLspKey(teTunnelKey, 1);
+
+        DefaultTeRouteUnnumberedLink unnumberedLink1 =
+                new DefaultTeRouteUnnumberedLink(srcNodeKey, srcTtpKey);
+        DefaultTeRouteUnnumberedLink unnumberedLink2 =
+                new DefaultTeRouteUnnumberedLink(dstNodeKey, dstTtpKey);
+        List<TeRouteSubobject> explicitRouteList = new ArrayList<>();
+
+        explicitRouteList.add(unnumberedLink1);
+        explicitRouteList.add(unnumberedLink2);
+        TePath tePath = new DefaultTePath(TePath.Type.EXPLICIT,
+                                          Lists.newArrayList(lspKey),
+                                          explicitRouteList,
+                                          Lists.newArrayList());
+
+        return DefaultTeTunnel.builder()
+                .teTunnelKey(teTunnelKey)
+                .name(NAME)
+                .type(P2P)
+                .adminState(TeTunnel.State.UP)
+                .srcNode(srcNodeKey)
+                .dstNode(dstNodeKey)
+                .srcTp(srcTtpKey)
+                .dstTp(dstTtpKey)
+                .lspProtectionType(LSP_PROT_REROUTE)
+                .primaryPaths(Lists.newArrayList(tePath))
+                .build();
+    }
+
+    private class TestTunnelAdmin implements TeTunnelAdminService {
+
+        @Override
+        public TunnelId createTeTunnel(TeTunnel teTunnel) {
+            TunnelId tunnelId = TunnelId.valueOf(teTunnel.teTunnelKey().toString());
+            testTeTunnel = teTunnel;
+            return tunnelId;
+        }
+
+        @Override
+        public void setTunnelId(TeTunnelKey teTunnelKey, TunnelId tunnelId) {
+
+        }
+
+        @Override
+        public void updateTeTunnel(TeTunnel teTunnel) {
+
+        }
+
+        @Override
+        public void updateTunnelState(TeTunnelKey key, org.onosproject.incubator.net.tunnel.Tunnel.State state) {
+
+        }
+
+        @Override
+        public void removeTeTunnel(TeTunnelKey teTunnelKey) {
+
+        }
+
+        @Override
+        public void removeTeTunnels() {
+
+        }
+
+        @Override
+        public void setSegmentTunnel(TeTunnelKey e2eTunnelKey, List<TeTunnelKey> segmentTunnels) {
+
+        }
+
+        @Override
+        public TeTunnel getTeTunnel(TeTunnelKey teTunnelKey) {
+            return null;
+        }
+
+        @Override
+        public TeTunnel getTeTunnel(TunnelId tunnelId) {
+            return null;
+        }
+
+        @Override
+        public TunnelId getTunnelId(TeTunnelKey teTunnelKey) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels() {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels(TeTunnel.Type type) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeTunnel> getTeTunnels(TeTopologyKey teTopologyKey) {
+            return null;
+        }
+
+        @Override
+        public TeLsp getTeLsp(TeLspKey key) {
+            return null;
+        }
+
+        @Override
+        public Collection<TeLsp> getTeLsps() {
+            return null;
+        }
+    }
+
+}
\ No newline at end of file