c7b843a9e31ed2422aa593ade73e80b75461a553
[bgpcep.git] / pcep / topology / topology-provider / src / test / java / org / opendaylight / bgpcep / pcep / topology / provider / IncrementalSynchronizationProcedureTest.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
9 package org.opendaylight.bgpcep.pcep.topology.provider;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createLsp;
14 import static org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil.createPath;
15 import static org.opendaylight.protocol.util.CheckTestUtil.readDataOperational;
16
17 import java.util.Collections;
18 import java.util.Optional;
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.rev181109.Tlvs3;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3Builder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersion;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Stateful1;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Stateful1Builder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.OperationalStatus;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Pcrpt;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.PlspId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.SymbolicPathName;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1Builder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiersBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.object.LspBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.StatefulBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathNameBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.OpenBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev181109.PccSyncState;
44 import org.opendaylight.yangtools.yang.common.Uint32;
45 import org.opendaylight.yangtools.yang.common.Uint64;
46
47 public class IncrementalSynchronizationProcedureTest
48         extends AbstractPCEPSessionTest<Stateful07TopologySessionListenerFactory> {
49
50     private Stateful07TopologySessionListener listener;
51
52     @Override
53     @Before
54     public void setUp() throws Exception {
55         super.setUp();
56         this.listener = (Stateful07TopologySessionListener) getSessionListener();
57     }
58
59     @Test
60     public void testStateSynchronizationPerformed() throws Exception {
61         PCEPSession session = getPCEPSession(getOpen(null), getOpen(null));
62         this.listener.onSessionUp(session);
63         //report LSP + LSP-DB version number
64         final Pcrpt pcRpt = getPcrpt(Uint32.ONE, "test");
65         this.listener.onMessage(session, pcRpt);
66         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
67             assertFalse(pcc.getReportedLsp().isEmpty());
68             return pcc;
69         });
70
71         this.listener.onSessionDown(session, new IllegalArgumentException());
72         this.listener = (Stateful07TopologySessionListener) getSessionListener();
73
74         //session up - expect sync (LSP-DBs do not match)
75         final LspDbVersion localDbVersion = new LspDbVersionBuilder()
76                 .setLspDbVersionValue(Uint64.valueOf(2L)).build();
77         session = getPCEPSession(getOpen(localDbVersion), getOpen(null));
78         this.listener.onSessionUp(session);
79         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
80             //check node - IncrementalSync state
81             assertEquals(PccSyncState.IncrementalSync, pcc.getStateSync());
82             //check reported LSP - persisted from previous session
83             assertFalse(pcc.getReportedLsp().isEmpty());
84             return pcc;
85         });
86
87         //report LSP2 + LSP-DB version number 2
88         final Pcrpt pcRpt2 = getPcrpt(Uint32.valueOf(2), "testsecond");
89         this.listener.onMessage(session, pcRpt2);
90         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
91             //check node - synchronized
92             assertEquals(PccSyncState.IncrementalSync, pcc.getStateSync());
93             //check reported LSP is not empty
94             assertEquals(2, pcc.getReportedLsp().size());
95             return pcc;
96         });
97
98         //sync rpt + LSP-DB
99         final Pcrpt syncMsg = getSyncPcrt();
100         this.listener.onMessage(session, syncMsg);
101         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
102             //check node - synchronized
103             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
104             //check reported LSP is empty, LSP state from previous session was purged
105             assertEquals(2, pcc.getReportedLsp().size());
106             return pcc;
107         });
108
109         //report LSP3 + LSP-DB version number 4
110         final Pcrpt pcRpt3 = getPcrpt(Uint32.valueOf(3), "testthird");
111         this.listener.onMessage(session, pcRpt3);
112         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
113             //check node - synchronized
114             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
115             assertEquals(3,pcc.getReportedLsp().size());
116             return pcc;
117         });
118     }
119
120     private Open getOpen(final LspDbVersion dbVersion) {
121         return new OpenBuilder(super.getLocalPref()).setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class,
122             new Tlvs1Builder().setStateful(new StatefulBuilder().addAugmentation(Stateful1.class,
123                 new Stateful1Builder().setInitiation(Boolean.TRUE).build())
124             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
125                     .optimizations.rev181109.Stateful1.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.params
126                     .xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Stateful1Builder()
127                 .setIncludeDbVersion(Boolean.TRUE).setDeltaLspSyncCapability(Boolean.TRUE).build())
128             .build()).build()).addAugmentation(Tlvs3.class, new Tlvs3Builder().setLspDbVersion(dbVersion).build())
129             .build()).build();
130     }
131
132     private static Pcrpt getPcrpt(final Uint32 val, final String pathname) {
133         return MsgBuilderUtil.createPcRtpMessage(new LspBuilder().setPlspId(new PlspId(val)).setTlvs(
134             new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp
135                     .object.lsp.TlvsBuilder().setLspIdentifiers(new LspIdentifiersBuilder()
136                     .setLspId(new LspId(val)).build())
137                 .setSymbolicPathName(new SymbolicPathNameBuilder().setPathName(new SymbolicPathName(
138                     pathname.getBytes())).build()).addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params
139                 .xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1.class, new org.opendaylight.yang.gen.v1
140                     .urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1Builder()
141                 .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(Uint64.valueOf(val)).build())
142                 .build()).build()).setPlspId(new PlspId(val)
143         ).setSync(true).setRemove(false).setOperational(OperationalStatus.Active).build(), Optional.empty(),
144             createPath(Collections.emptyList()));
145     }
146
147     private static Pcrpt getSyncPcrt() {
148         return MsgBuilderUtil.createPcRtpMessage(createLsp(Uint32.ZERO, false, Optional.of(
149                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
150                         .lsp.object.lsp.TlvsBuilder().addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight
151                                 .params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1.class,
152                         new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
153                                 .optimizations.rev181109.Tlvs1Builder().setLspDbVersion(new LspDbVersionBuilder()
154                                 .setLspDbVersionValue(Uint64.valueOf(3L)).build()).build()).build()),
155                 true, false), Optional.empty(),
156                 createPath(Collections.emptyList()));
157     }
158 }