Code clean up
[bgpcep.git] / pcep / 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.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createLsp;
11 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createPath;
12
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;
52
53 public class PCEPTriggeredReSynchronizationProcedureTest extends AbstractPCEPSessionTest<Stateful07TopologySessionListenerFactory> {
54     private Stateful07TopologySessionListener listener;
55
56     private PCEPSession session;
57
58     @Override
59     @Before
60     public void setUp() throws Exception {
61         super.setUp();
62         this.listener = (Stateful07TopologySessionListener) getSessionListener();
63     }
64
65     @Test
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);
71
72         //report LSP + LSP-DB version number
73         final Pcrpt pcRpt = getPcrt();
74         this.listener.onMessage(session, pcRpt);
75
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());
79
80         //PCEP Trigger Full Resync
81         this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
82
83         final PathComputationClient pcc1 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
84         Assert.assertEquals(PccSyncState.PcepTriggeredResync, pcc1.getStateSync());
85
86         //end of sync
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());
92
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());
96
97         //Trigger Full Resync
98         this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).build());
99         this.listener.onMessage(session, pcRpt);
100         //end of sync
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());
107     }
108
109     @Test
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);
115
116         //report LSP + LSP-DB version number
117         final Pcrpt pcRpt = getPcrt();
118         this.listener.onMessage(session, pcRpt);
119
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());
124
125         //Trigger Full Resync
126         this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
127
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());
131
132         this.listener.onMessage(session, pcRpt);
133
134         Assert.assertFalse(reportedLspPcc.isEmpty());
135
136         //sync rpt + LSP-DB
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());
142         //check reported LSP
143         Assert.assertEquals(1, pcc2.getReportedLsp().size());
144
145         //Trigger Full Resync
146         this.listener.triggerSync(new TriggerSyncInputBuilder().setNode(nodeId).setName("test").build());
147         this.listener.onMessage(session, syncMsg);
148
149         final PathComputationClient pcc3 = getTopology().get().getNode().get(0).getAugmentation(Node1.class).getPathComputationClient();
150         //check node - synchronized
151         Assert.assertEquals(PccSyncState.Synchronized, pcc3.getStateSync());
152         //check reported LSP
153         Assert.assertEquals(0, pcc3.getReportedLsp().size());
154
155     }
156
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();
164     }
165
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()));
176     }
177
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()));
188     }
189 }