2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.bgpcep.pcep.topology.provider;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
16 import com.google.common.base.Optional;
17 import com.google.common.collect.Lists;
18 import io.netty.buffer.Unpooled;
19 import io.netty.util.CharsetUtil;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.topology.rev140113.NetworkTopologyRef;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Pcinitiate;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Arguments1;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Arguments1Builder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Arguments2;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Arguments2Builder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Pcrpt;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.PcrptBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Pcupd;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.PlspId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.SymbolicPathName;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.Tlvs2Builder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.LspBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.lsp.TlvsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcrpt.message.PcrptMessageBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcrpt.message.pcrpt.message.ReportsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcrpt.message.pcrpt.message.reports.PathBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.pcupd.message.pcupd.message.Updates;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.stateful.capability.tlv.StatefulBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.symbolic.path.name.tlv.SymbolicPathNameBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.Ipv4CaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.ipv4._case.Ipv4Builder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.object.EndpointsObjBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.AddLspInputBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.EnsureLspOperationalInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.OperationResult;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.RemoveLspInputBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.UpdateLspInputBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.add.lsp.args.ArgumentsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.PathComputationClient;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLsp;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.reported.lsp.Path;
64 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
66 public class Stateful02TopologySessionListenerTest extends AbstractPCEPSessionTest<Stateful02TopologySessionListenerFactory> {
68 private Stateful02TopologySessionListener listener;
71 public void setUp() throws Exception {
73 listener = (Stateful02TopologySessionListener) this.manager.getSessionListener();
77 public void testStateful02TopologySessionListener() throws Exception {
78 this.listener.onSessionUp(this.session);
81 final ArgumentsBuilder argsBuilder = new ArgumentsBuilder();
82 final Ipv4CaseBuilder ipv4Builder = new Ipv4CaseBuilder();
83 ipv4Builder.setIpv4(new Ipv4Builder().setSourceIpv4Address(new Ipv4Address(TEST_ADDRESS)).setDestinationIpv4Address(new Ipv4Address(TEST_ADDRESS)).build());
84 argsBuilder.setEndpointsObj(new EndpointsObjBuilder().setAddressFamily(ipv4Builder.build()).build());
85 final AddLspInput input = new AddLspInputBuilder().setName(TEST_LSP_NAME).setArguments(argsBuilder.build()).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
86 this.topologyRpcs.addLsp(input);
87 assertEquals(1, this.receivedMsgs.size());
88 assertTrue(this.receivedMsgs.get(0) instanceof Pcinitiate);
89 final Pcrpt pcRpt = createPcrpt02(0L, false, null, Optional.of(TEST_LSP_NAME));
91 final Optional<Topology> topoOptional = getTopology();
92 assertTrue(topoOptional.isPresent());
93 Topology topology = topoOptional.get();
94 assertEquals(1, topology.getNode().size());
95 final Node1 node = topology.getNode().get(0).getAugmentation(Node1.class);
97 PathComputationClient pcc = node.getPathComputationClient();
98 assertEquals(TEST_ADDRESS, pcc.getIpAddress().getIpv4Address().getValue());
99 // reported lsp so far empty, has not received response (PcRpt) yet
100 assertTrue(pcc.getReportedLsp().isEmpty());
101 this.listener.onMessage(this.session, pcRpt);
103 topology = getTopology().get();
104 pcc = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
105 assertEquals(1, pcc.getReportedLsp().size());
106 ReportedLsp reportedLsp = pcc.getReportedLsp().get(0);
107 assertEquals(TEST_LSP_NAME, reportedLsp.getName());
108 assertEquals(1, reportedLsp.getPath().size());
111 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.update.lsp.args.ArgumentsBuilder updArgsBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.update.lsp.args.ArgumentsBuilder();
112 updArgsBuilder.setEro(createEroWithIpPrefixes(Lists.newArrayList(ERO_IP_PREFIX, DST_IP_PREFIX)));
113 updArgsBuilder.addAugmentation(Arguments2.class, new Arguments2Builder().setOperational(true).build());
114 final UpdateLspInput update = new UpdateLspInputBuilder().setArguments(updArgsBuilder.build()).setName(TEST_LSP_NAME).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
115 this.topologyRpcs.updateLsp(update);
116 assertEquals(2, this.receivedMsgs.size());
117 assertTrue(this.receivedMsgs.get(1) instanceof Pcupd);
118 final Pcupd updateMsg = (Pcupd) this.receivedMsgs.get(1);
119 final Updates upd = updateMsg.getPcupdMessage().getUpdates().get(0);
120 final Pcrpt pcRpt2 = createPcrpt02(upd.getLsp().getPlspId().getValue(), false, upd.getPath().getEro(), Optional.<String>absent());
121 this.listener.onMessage(this.session, pcRpt2);
123 topology = getTopology().get();
124 pcc = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
125 assertEquals(1, pcc.getReportedLsp().size());
126 reportedLsp = pcc.getReportedLsp().get(0);
127 assertEquals(TEST_LSP_NAME, reportedLsp.getName());
128 assertEquals(1, reportedLsp.getPath().size());
129 Path path = reportedLsp.getPath().get(0);
130 assertEquals(2, path.getEro().getSubobject().size());
131 assertEquals(DST_IP_PREFIX, getLastEroIpPrefix(path.getEro()));
133 // ensure-operational
134 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.ensure.lsp.operational.args.ArgumentsBuilder ensureArgs = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.ensure.lsp.operational.args.ArgumentsBuilder();
135 ensureArgs.addAugmentation(Arguments1.class, new Arguments1Builder().setOperational(true).build());
136 final EnsureLspOperationalInput ensure = new EnsureLspOperationalInputBuilder().setArguments(ensureArgs.build()).setName(TEST_LSP_NAME).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
137 final OperationResult result = this.topologyRpcs.ensureLspOperational(ensure).get().getResult();
139 assertNull(result.getFailure());
142 final RemoveLspInput remove = new RemoveLspInputBuilder().setName(TEST_LSP_NAME).setNetworkTopologyRef(new NetworkTopologyRef(TOPO_IID)).setNode(NODE_ID).build();
143 this.topologyRpcs.removeLsp(remove);
144 assertEquals(3, this.receivedMsgs.size());
145 assertTrue(this.receivedMsgs.get(2) instanceof Pcupd);
146 final Pcupd pcUpd2 = (Pcupd) this.receivedMsgs.get(2);
147 final Updates upd2 = pcUpd2.getPcupdMessage().getUpdates().get(0);
148 final Pcrpt pcRpt3 = createPcrpt02(upd2.getLsp().getPlspId().getValue(), true, null, Optional.<String>absent());
149 this.listener.onMessage(this.session, pcRpt3);
150 // check if lsp was removed
151 topology = getTopology().get();
152 pcc = topology.getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
153 assertEquals(0, pcc.getReportedLsp().size());
156 private Pcrpt createPcrpt02(final long plspId, final boolean remove, final Ero ero, final Optional<String> spn) {
157 final ReportsBuilder rptBuilder = new ReportsBuilder();
158 final TlvsBuilder tlvsBuilder = new TlvsBuilder();
159 if (spn.isPresent()) {
160 tlvsBuilder.setSymbolicPathName(new SymbolicPathNameBuilder().setPathName(new SymbolicPathName(Unpooled.wrappedBuffer(CharsetUtil.UTF_8.encode(spn.get())).array())).build());
162 rptBuilder.setLsp(new LspBuilder().setDelegate(true).setOperational(true).setPlspId(new PlspId(plspId)).setRemove(remove).setSync(true).setTlvs(tlvsBuilder.build()).build());
163 rptBuilder.setPath(new PathBuilder().setEro(ero).build());
164 return new PcrptBuilder().setPcrptMessage(new PcrptMessageBuilder().setReports(Lists.newArrayList(rptBuilder.build())).build()).build();
168 protected Open getLocalPref() {
169 return new OpenBuilder(super.getLocalPref()).setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().addAugmentation(Tlvs2.class, new Tlvs2Builder().setStateful(new StatefulBuilder().build()).build()).build()).build();