blob: 8ad125abef0afaa9e2774f33ea3ae73a5c5cacec [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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;
}
}
}