Update MRI projects for Aluminium
[bgpcep.git] / pcep / topology / topology-provider / src / test / java / org / opendaylight / bgpcep / pcep / topology / provider / StateSynchronizationAvoidanceProcedureTest.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.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.Optional;
20 import java.util.concurrent.ExecutionException;
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.rev181109.PathComputationClient1;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3Builder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersion;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Stateful1;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Stateful1Builder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.OperationalStatus;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Pcrpt;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.PlspId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.SymbolicPathName;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1Builder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiersBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.object.LspBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.StatefulBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathNameBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.OpenBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev200120.PccSyncState;
47 import org.opendaylight.yangtools.yang.common.Uint32;
48 import org.opendaylight.yangtools.yang.common.Uint64;
49
50 public class StateSynchronizationAvoidanceProcedureTest extends
51     AbstractPCEPSessionTest<Stateful07TopologySessionListenerFactory> {
52
53     private Stateful07TopologySessionListener listener;
54
55     @Override
56     @Before
57     public void setUp() throws Exception {
58         super.setUp();
59         this.listener = (Stateful07TopologySessionListener) getSessionListener();
60     }
61
62     @Test
63     public void testNodePersisted() throws ExecutionException, InterruptedException {
64         final PCEPSession session = getPCEPSession(getOpen(null), getOpen(null));
65         this.listener.onSessionUp(session);
66         //report LSP + LSP-DB version number
67         final Pcrpt pcRpt = MsgBuilderUtil.createPcRtpMessage(new LspBuilder().setTlvs(
68                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp
69                         .object.lsp.TlvsBuilder().addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params
70                                 .xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1.class,
71                         new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
72                                 .optimizations.rev181109.Tlvs1Builder().setLspDbVersion(new LspDbVersionBuilder()
73                                 .setLspDbVersionValue(Uint64.ONE).build()).build()).build())
74                         .setPlspId(new PlspId(Uint32.ONE)).setSync(false).setRemove(false)
75                         .setOperational(OperationalStatus.Active).build(),
76                 Optional.of(MsgBuilderUtil.createSrp(Uint32.ONE)), null);
77         this.listener.onMessage(session, pcRpt);
78         //check topology
79         readDataOperational(getDataBroker(), this.pathComputationClientIId.builder()
80                 .augmentation(PathComputationClient1.class)
81                 .child(LspDbVersion.class).build(), dbVersion -> {
82                 assertEquals(1L, dbVersion.getLspDbVersionValue().longValue());
83                 return dbVersion;
84             });
85
86         //drop session
87         this.listener.onSessionDown(session, new IllegalStateException());
88         readDataOperational(getDataBroker(), TOPO_IID, topology -> {
89             assertFalse(topology.getNode().isEmpty());
90             return topology;
91         });
92         //check topology - node is persisted
93     }
94
95     @Test
96     public void testStateSynchronizationSkipped() throws Exception {
97         //session up - sync skipped (LSP-DBs match)
98         final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(Uint64.ONE).build();
99         final PCEPSession session = getPCEPSession(getOpen(lspDbVersion), getOpen(lspDbVersion));
100         this.listener.onSessionUp(session);
101         //check node - synchronized
102         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
103             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
104             return pcc;
105         });
106     }
107
108     @Test
109     public void testStateSynchronizationPerformed() throws Exception {
110         PCEPSession session = getPCEPSession(getOpen(null), getOpen(null));
111         this.listener.onSessionUp(session);
112         //report LSP + LSP-DB version number
113         final Pcrpt pcRpt = MsgBuilderUtil.createPcRtpMessage(new LspBuilder().setPlspId(new PlspId(Uint32.ONE))
114                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
115                         .rev181109.lsp.object.lsp.TlvsBuilder().setLspIdentifiers(new LspIdentifiersBuilder()
116                         .setLspId(new LspId(Uint32.ONE)).build()).setSymbolicPathName(new SymbolicPathNameBuilder()
117                         .setPathName(new SymbolicPathName("test".getBytes())).build()).addAugmentation(org.opendaylight
118                         .yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109
119                         .Tlvs1.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller
120                         .pcep.sync.optimizations.rev181109.Tlvs1Builder().setLspDbVersion(new LspDbVersionBuilder()
121                         .setLspDbVersionValue(Uint64.ONE).build()).build()).build())
122                 .setPlspId(new PlspId(Uint32.ONE)).setSync(true).setRemove(false)
123                 .setOperational(OperationalStatus.Active)
124                 .build(), Optional.empty(), createPath(Collections.emptyList()));
125         this.listener.onMessage(session, pcRpt);
126         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
127             assertFalse(pcc.nonnullReportedLsp().isEmpty());
128             return pcc;
129         });
130
131         this.listener.onSessionDown(session, new IllegalArgumentException("Simulate Exception"));
132         this.listener = (Stateful07TopologySessionListener) getSessionListener();
133
134         //session up - expect sync (LSP-DBs do not match)
135         final LspDbVersion localDbVersion = new LspDbVersionBuilder()
136                 .setLspDbVersionValue(Uint64.TWO).build();
137         session = getPCEPSession(getOpen(localDbVersion), getOpen(null));
138         this.listener.onSessionUp(session);
139
140         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
141             //check node - not synchronized
142             assertEquals(PccSyncState.InitialResync, pcc.getStateSync());
143             //check reported LSP - persisted from previous session
144             assertFalse(pcc.nonnullReportedLsp().isEmpty());
145             return pcc;
146         });
147
148         //sync rpt + LSP-DB
149         final Pcrpt syncMsg = MsgBuilderUtil.createPcRtpMessage(createLsp(Uint32.ZERO, false, Optional.of(
150                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
151                         .lsp.object.lsp.TlvsBuilder().addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight
152                                 .params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1.class,
153                         new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
154                                 .optimizations.rev181109.Tlvs1Builder().setLspDbVersion(new LspDbVersionBuilder()
155                                 .setLspDbVersionValue(Uint64.TWO).build()).build()).build()),
156                 true, false), Optional.empty(),
157                 createPath(Collections.emptyList()));
158         this.listener.onMessage(session, syncMsg);
159         readDataOperational(getDataBroker(), this.pathComputationClientIId, pcc -> {
160             //check node - synchronized
161             assertEquals(PccSyncState.Synchronized, pcc.getStateSync());
162             //check reported LSP is empty, LSP state from previous session was purged
163             assertNull(pcc.getReportedLsp());
164             return pcc;
165         });
166     }
167
168     private Open getOpen(final LspDbVersion dbVersion) {
169         return new OpenBuilder(super.getLocalPref()).setTlvs(new TlvsBuilder().addAugmentation(Tlvs1.class,
170             new Tlvs1Builder().setStateful(new StatefulBuilder()
171             .addAugmentation(Stateful1.class, new Stateful1Builder().setInitiation(Boolean.TRUE).build())
172             .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
173                     .optimizations.rev181109.Stateful1.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.params
174                     .xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Stateful1Builder()
175                 .setIncludeDbVersion(Boolean.TRUE).build()).build()).build()).addAugmentation(Tlvs3.class,
176             new Tlvs3Builder().setLspDbVersion(dbVersion).build()).build()).build();
177     }
178
179 }