Eliminate network-pcep-topology-config
[bgpcep.git] / pcep / topology / topology-provider / src / test / java / org / opendaylight / bgpcep / pcep / topology / provider / PCEPTriggeredReSynchronizationProcedureTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.bgpcep.pcep.topology.provider;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertNull;
14 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createLsp;
15 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createPath;
16 import static org.opendaylight.protocol.util.CheckTestUtil.readDataOperational;
17
18 import java.util.Collections;
19 import java.util.Map;
20 import java.util.Optional;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.protocol.pcep.PCEPSession;
24 import org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3Builder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersion;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Stateful1Builder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.OperationalStatus;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Pcrpt;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SymbolicPathName;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1Builder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.LspIdentifiersBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.LspBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.SrpBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.StatefulBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.symbolic.path.name.tlv.SymbolicPathNameBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.OpenBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.PccSyncState;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.TriggerSyncInputBuilder;
46 import org.opendaylight.yangtools.yang.common.Uint32;
47 import org.opendaylight.yangtools.yang.common.Uint64;
48
49 public class PCEPTriggeredReSynchronizationProcedureTest extends AbstractPCEPSessionTest {
50     private PCEPTopologySessionListener listener;
51
52     private PCEPSession session;
53     private final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(Uint64.ONE).build();
54
55     @Override
56     @Before
57     public void setUp() throws Exception {
58         super.setUp();
59         listener = getSessionListener();
60     }
61
62     @Test
63     public void testTriggeredResynchronization() throws Exception {
64         //session up - sync skipped (LSP-DBs match)
65         session = getPCEPSession(getOpen(), getOpen());
66         listener.onSessionUp(session);
67
68         //report LSP + LSP-DB version number
69         final Pcrpt pcRpt = getPcrt();
70         listener.onMessage(session, pcRpt);
71
72         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
73             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
74             assertFalse(pcc.nonnullReportedLsp().isEmpty());
75             return pcc;
76         });
77
78         //PCEP Trigger Full Resync
79         listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
80         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
81             assertEquals(PccSyncState.PcepTriggeredResync, pcc.getStateSync());
82             return pcc;
83         });
84
85         //end of sync
86         final Pcrpt syncMsg = getSyncMsg();
87         listener.onMessage(session, syncMsg);
88         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
89             //check node - synchronized
90             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
91             return pcc;
92         });
93
94         listener.onMessage(session, pcRpt);
95         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
96             final Map<?, ?> lsp = pcc.getReportedLsp();
97             assertNotNull(lsp);
98             assertEquals(1, lsp.size());
99             return pcc;
100         });
101
102         //Trigger Full Resync
103         listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
104         listener.onMessage(session, pcRpt);
105         //end of sync
106         listener.onMessage(session, syncMsg);
107         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
108             //check node - synchronized
109             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
110             //check reported LSP is not empty, Stale LSP state were purged
111             assertEquals(1, pcc.getReportedLsp().size());
112             return pcc;
113         });
114     }
115
116     @Test
117     public void testTriggeredResynchronizationLsp() throws Exception {
118         //session up - sync skipped (LSP-DBs match)
119
120         session = getPCEPSession(getOpen(), getOpen());
121         listener.onSessionUp(session);
122
123         //report LSP + LSP-DB version number
124         final Pcrpt pcRpt = getPcrt();
125         listener.onMessage(session, pcRpt);
126         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
127             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
128             assertFalse(pcc.nonnullReportedLsp().isEmpty());
129             return pcc;
130         });
131
132         //Trigger Full Resync
133         listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
134         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
135             assertEquals(PccSyncState.PcepTriggeredResync, pcc.getStateSync());
136             assertFalse(pcc.nonnullReportedLsp().isEmpty());
137             return pcc;
138         });
139
140         listener.onMessage(session, pcRpt);
141         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
142             assertFalse(pcc.nonnullReportedLsp().isEmpty());
143             return pcc;
144         });
145
146         //sync rpt + LSP-DB
147         final Pcrpt syncMsg = getSyncMsg();
148         listener.onMessage(session, syncMsg);
149         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
150             //check node - synchronized
151             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
152             //check reported LSP
153             assertEquals(1, pcc.nonnullReportedLsp().size());
154             return pcc;
155         });
156
157         //Trigger Full Resync
158         listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
159         listener.onMessage(session, syncMsg);
160         readDataOperational(getDataBroker(), pathComputationClientIId, pcc -> {
161             //check node - synchronized
162             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
163             //check reported LSP
164             assertNull(pcc.getReportedLsp());
165             return pcc;
166         });
167     }
168
169     private Open getOpen() {
170         return new OpenBuilder(super.getLocalPref()).setTlvs(new TlvsBuilder().addAugmentation(new Tlvs1Builder()
171             .setStateful(new StatefulBuilder()
172                 .addAugmentation(new Stateful1Builder().setInitiation(Boolean.TRUE).build())
173                 .addAugmentation(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep
174                     .sync.optimizations.rev200720.Stateful1Builder()
175                         .setIncludeDbVersion(Boolean.TRUE).setTriggeredResync(Boolean.TRUE)
176                         .build())
177                 .build())
178             .build()).addAugmentation(new Tlvs3Builder().setLspDbVersion(lspDbVersion).build()).build()).build();
179     }
180
181     private static Pcrpt getSyncMsg() {
182         final SrpBuilder srpBuilder = new SrpBuilder();
183         // not sue whether use 0 instead of nextRequest() or do not insert srp == SRP-ID-number = 0
184         srpBuilder.setOperationId(new SrpIdNumber(Uint32.ONE));
185         return MsgBuilderUtil.createPcRtpMessage(createLsp(Uint32.ZERO, false, Optional.of(
186                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp
187                         .object.lsp.TlvsBuilder().addAugmentation(new org.opendaylight.yang.gen.v1.urn.opendaylight
188                             .params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs1Builder()
189                             .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(Uint64.valueOf(3L))
190                                 .build()).build()).build()), true, false),
191             Optional.of(srpBuilder.build()), createPath(Collections.emptyList()));
192     }
193
194     private static Pcrpt getPcrt() {
195         return MsgBuilderUtil.createPcRtpMessage(new LspBuilder().setPlspId(new PlspId(Uint32.ONE)).setTlvs(
196                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp
197                         .object.lsp.TlvsBuilder().setLspIdentifiers(new LspIdentifiersBuilder()
198                         .setLspId(new LspId(Uint32.ONE)).build()).setSymbolicPathName(
199                             new SymbolicPathNameBuilder().setPathName(new SymbolicPathName("test".getBytes())).build())
200                     .addAugmentation(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller
201                         .pcep.sync.optimizations.rev200720.Tlvs1Builder().setLspDbVersion(new LspDbVersionBuilder()
202                                 .setLspDbVersionValue(Uint64.ONE).build()).build()).build())
203                 .setPlspId(new PlspId(Uint32.ONE)).setSync(true).setRemove(false)
204                         .setOperational(OperationalStatus.Active).build(), Optional.empty(),
205             createPath(Collections.emptyList()));
206     }
207 }