2 * Copyright (c) 2015 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
8 package org.opendaylight.bgpcep.pcep.topology.provider;
10 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createLsp;
11 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createPath;
13 import com.google.common.base.Optional;
14 import java.math.BigInteger;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.concurrent.ExecutionException;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.protocol.pcep.PCEPSession;
22 import org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs3Builder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersion;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.lsp.db.version.tlv.LspDbVersionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1Builder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SymbolicPathName;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.symbolic.path.name.tlv.SymbolicPathNameBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.Open;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.Node1;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.PccSyncState;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.TriggerSyncInputBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.PathComputationClient;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev131024.pcep.client.attributes.path.computation.client.ReportedLsp;
53 public class PCEPTriggeredReSynchronizationProcedureTest extends AbstractPCEPSessionTest<Stateful07TopologySessionListenerFactory> {
54 private Stateful07TopologySessionListener listener;
56 private PCEPSession session;
60 public void setUp() throws Exception {
62 this.listener = (Stateful07TopologySessionListener) getSessionListener();
66 public void testTriggeredResynchronization() throws InterruptedException, ExecutionException {
67 //session up - sync skipped (LSP-DBs match)
68 final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(1L)).build();
69 this.session = getPCEPSession(getOpen(lspDbVersion), getOpen(lspDbVersion));
70 this.listener.onSessionUp(session);
72 //report LSP + LSP-DB version number
73 final Pcrpt pcRpt = getPcrt();
74 this.listener.onMessage(session, pcRpt);
76 final PathComputationClient pcc = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
77 Assert.assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
78 Assert.assertFalse(pcc.getReportedLsp().isEmpty());
80 //PCEP Trigger Full Resync
81 this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
83 final PathComputationClient pcc1 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
84 Assert.assertEquals(PccSyncState.PcepTriggeredResync, pcc1.getStateSync());
87 final Pcrpt syncMsg = getSyncMsg();
88 this.listener.onMessage(session, syncMsg);
89 final PathComputationClient pcc2 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
90 //check node - synchronized
91 Assert.assertEquals(PccSyncState.Synchronized, pcc2.getStateSync());
93 this.listener.onMessage(session, pcRpt);
94 final PathComputationClient pcc3 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
95 Assert.assertEquals(1, pcc3.getReportedLsp().size());
98 this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
99 this.listener.onMessage(session, pcRpt);
101 this.listener.onMessage(session, syncMsg);
102 final PathComputationClient pcc4 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
103 //check node - synchronized
104 Assert.assertEquals(PccSyncState.Synchronized, pcc4.getStateSync());
105 //check reported LSP is not empty, Stale LSP state were purged
106 Assert.assertEquals(1, pcc4.getReportedLsp().size());
110 public void testTriggeredResynchronizationLsp() throws InterruptedException, ExecutionException {
111 //session up - sync skipped (LSP-DBs match)
112 final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(1L)).build();
113 this.session = getPCEPSession(getOpen(lspDbVersion), getOpen(lspDbVersion));
114 this.listener.onSessionUp(session);
116 //report LSP + LSP-DB version number
117 final Pcrpt pcRpt = getPcrt();
118 this.listener.onMessage(session, pcRpt);
120 final PathComputationClient pcc = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
121 Assert.assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
122 final List<ReportedLsp> reportedLspPcc = pcc.getReportedLsp();
123 Assert.assertFalse(reportedLspPcc.isEmpty());
125 //Trigger Full Resync
126 this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
128 final PathComputationClient pcc1 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
129 Assert.assertEquals(PccSyncState.PcepTriggeredResync, pcc1.getStateSync());
130 Assert.assertFalse(pcc1.getReportedLsp().isEmpty());
132 this.listener.onMessage(session, pcRpt);
134 Assert.assertFalse(reportedLspPcc.isEmpty());
137 final Pcrpt syncMsg = getSyncMsg();
138 this.listener.onMessage(session, syncMsg);
139 final PathComputationClient pcc2 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
140 //check node - synchronized
141 Assert.assertEquals(PccSyncState.Synchronized, pcc2.getStateSync());
143 Assert.assertEquals(1, pcc2.getReportedLsp().size());
145 //Trigger Full Resync
146 this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
147 this.listener.onMessage(session, syncMsg);
149 final PathComputationClient pcc3 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
150 //check node - synchronized
151 Assert.assertEquals(PccSyncState.Synchronized, pcc3.getStateSync());
153 Assert.assertEquals(0, pcc3.getReportedLsp().size());
157 private Open getOpen(final LspDbVersion dbVersion) {
158 return new OpenBuilder(super.getLocalPref()).setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class, new Tlvs1Builder().setStateful(new StatefulBuilder()
159 .addAugmentation(Stateful1.class, new Stateful1Builder().setInitiation(Boolean.TRUE).build())
160 .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Stateful1.class,
161 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Stateful1Builder()
162 .setIncludeDbVersion(Boolean.TRUE).setTriggeredResync(Boolean.TRUE).build())
163 .build()).build()).addAugmentation(Tlvs3.class, new Tlvs3Builder().setLspDbVersion(dbVersion).build()).build()).build();
166 private Pcrpt getSyncMsg() {
167 final SrpBuilder srpBuilder = new SrpBuilder();
168 // not sue whether use 0 instead of nextRequest() or do not insert srp == SRP-ID-number = 0
169 srpBuilder.setOperationId(new SrpIdNumber(1L));
170 return MsgBuilderUtil.createPcRtpMessage(createLsp(0, false, Optional.of(
171 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder().addAugmentation(
172 org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1.class,
173 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1Builder()
174 .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(3L)).build()).build()).build()), true, false),
175 Optional.of(srpBuilder.build()), createPath(Collections.emptyList()));
178 private Pcrpt getPcrt() {
179 return MsgBuilderUtil.createPcRtpMessage(new LspBuilder().setPlspId(new PlspId(1L)).setTlvs(
180 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.
181 TlvsBuilder().setLspIdentifiers(new LspIdentifiersBuilder().setLspId(new LspId(1L)).build()).setSymbolicPathName(
182 new SymbolicPathNameBuilder().setPathName(new SymbolicPathName("test".getBytes())).build())
183 .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1.class,
184 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1Builder()
185 .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(1L)).build()).build()).build())
186 .setPlspId(new PlspId(1L)).setSync(true).setRemove(false).setOperational(OperationalStatus.Active).build(), Optional.absent(),
187 createPath(Collections.emptyList()));