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