4a240584743322c1556065cf7b64a7cadefcd612
[netvirt.git] / sfc / classifier / impl / src / test / java / org / opendaylight / netvirt / sfc / classifier / providers / SfcProviderTest.java
1 /*
2  * Copyright © 2017 Ericsson, 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.netvirt.sfc.classifier.providers;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
14
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
18 import java.util.Optional;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.controller.md.sal.binding.test.ConstantSchemaAbstractDataBrokerTest;
22 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
23 import org.opendaylight.genius.mdsalutil.MDSALUtil;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.RspName;
25 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
26 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfcName;
27 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffDataPlaneLocatorName;
28 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
29 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.RenderedServicePaths;
30 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
31 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathBuilder;
32 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePathKey;
33 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHop;
34 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.rendered.service.path.RenderedServicePathHopBuilder;
35 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwarders;
36 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
37 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorBuilder;
38 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorKey;
39 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocatorBuilder;
40 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
41 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
42 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
43 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionaryBuilder;
44 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocatorBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.data.plane.locator.locator.type.LogicalInterfaceBuilder;
46 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
47
48 public class SfcProviderTest extends ConstantSchemaAbstractDataBrokerTest {
49     private static final String RSP_NAME = "RSP1";
50     private static final String RSP_NAME_NOEXIST = "RSP_NOEXIST";
51     private static final String SFC_NAME = "SFC1";
52     private static final String SF_NAME = "SF1";
53     private static final String SFF_NAME = "SFF1";
54     private static final String SFF_DPL_NAME = "SFF_DPL";
55     private static final String LOGICAL_IF_NAME = "eccb57ae-5a2e-467f-823e-45d7bb2a6a9a";
56     private static final Long PATH_ID = Long.valueOf(1);
57
58     private SfcProvider sfcProvider;
59
60     @Before
61     public void setUp() throws Exception {
62         sfcProvider = new SfcProvider(getDataBroker());
63     }
64
65     @Test
66     public void getRenderedServicePath() {
67         RspName rspName = new RspName(RSP_NAME);
68         RenderedServicePathBuilder rspBuilder = createRsp(rspName);
69         storeRsp(rspName, rspBuilder.build());
70
71         Optional<RenderedServicePath> rspOptional = this.sfcProvider.getRenderedServicePath(RSP_NAME);
72         assertTrue(rspOptional.isPresent());
73     }
74
75     @Test
76     public void getRenderedServicePathNonExistantRsp() {
77         Optional<RenderedServicePath> rspOptional = this.sfcProvider.getRenderedServicePath(RSP_NAME_NOEXIST);
78         assertFalse(rspOptional.isPresent());
79     }
80
81     @Test
82     public void getRenderedServicePathFromSfc() {
83         // This method isnt implemented yet, so it should return empty
84         Optional<RenderedServicePath> rspOptional = this.sfcProvider.getRenderedServicePathFromSfc(SFC_NAME);
85         assertFalse(rspOptional.isPresent());
86     }
87
88     @Test
89     public void getFirstHopSfInterfaceFromRsp() {
90         RspName rspName = new RspName(RSP_NAME);
91
92         // Check RSP with no hops
93         RenderedServicePathBuilder rspBuilder = createRsp(rspName);
94         Optional<String> ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
95         assertFalse(ifName.isPresent());
96
97         // Check RSP with no SF name
98         rspBuilder = createRsp(rspName, true, false, false, false, false, false, false, false);
99         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
100         assertFalse(ifName.isPresent());
101
102         // Check RSP with SF name, but no SFF name
103         rspBuilder = createRsp(rspName, true, true, false, false, false, false,false, false);
104         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
105         assertFalse(ifName.isPresent());
106
107         // Check RSP with SF name, but SFF doesnt exist
108         rspBuilder = createRsp(rspName, true, true, true, false, false, false,false, false);
109         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
110         assertFalse(ifName.isPresent());
111
112         // Check RSP with SF and SFF, but SFF has no dictionary
113         rspBuilder = createRsp(rspName, true, true, true, false, false, true, false, false);
114         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
115         assertFalse(ifName.isPresent());
116
117         // Check RSP with SF and SFF, but SFF has no dictionary entry for SF
118         rspBuilder = createRsp(rspName, true, true, true, true, false, true, false, false);
119         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
120         assertFalse(ifName.isPresent());
121
122         // Check RSP with SF, SFF name, SFF exists, but has no DPL
123         rspBuilder = createRsp(rspName, true, true, true, true, true, true, false, false);
124         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
125         assertFalse(ifName.isPresent());
126
127         // Check RSP with Sfm SFF name, SFF exists, has DPL, but not of type LogicalInterfaceLocator
128         rspBuilder = createRsp(rspName, true, true, true, true, true, true, true, false);
129         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
130         assertFalse(ifName.isPresent());
131
132         // Check RSP when its all created correctly
133         rspBuilder = createRsp(rspName, true, true, true, true, true, true, true, true);
134         ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
135         assertTrue(ifName.isPresent());
136         assertEquals(ifName.get(), LOGICAL_IF_NAME);
137     }
138
139     private RenderedServicePathBuilder createRsp(RspName rspName) {
140         return new RenderedServicePathBuilder()
141                 .setName(rspName)
142                 .setServiceChainName(SfcName.getDefaultInstance(SFC_NAME))
143                 .setPathId(PATH_ID)
144                 .setReversePath(false);
145     }
146
147     private RenderedServicePathBuilder createRsp(RspName rspName, boolean hasHops, boolean hasSfName,
148                                                  boolean hasSffName, boolean hasDict, boolean hasSfDict,
149                                                  boolean createSff, boolean createSffDpl,
150                                                  boolean createLogicalSfDpl) {
151         RenderedServicePathBuilder rspBuilder = createRsp(rspName);
152         SffName sffName = new SffName(SFF_NAME);
153         SfName sfName = new SfName(SF_NAME);
154
155         RenderedServicePathHopBuilder rspHopBuilder = new RenderedServicePathHopBuilder();
156         if (hasSfName) {
157             rspHopBuilder.setServiceFunctionName(sfName);
158         }
159
160         if (hasSffName) {
161             rspHopBuilder.setServiceFunctionForwarder(sffName);
162         }
163
164         if (hasHops) {
165             List<RenderedServicePathHop> hops = new ArrayList<>();
166             hops.add(rspHopBuilder.build());
167             rspBuilder.setRenderedServicePathHop(hops);
168         }
169
170         ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
171         ServiceFunctionDictionaryBuilder serviceFunctionDictionaryBuilder = new ServiceFunctionDictionaryBuilder();
172         serviceFunctionDictionaryBuilder.setName(sfName);
173
174         if (hasSfDict) {
175             SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder();
176             sffSfDataPlaneLocatorBuilder.setSffDplName(new SffDataPlaneLocatorName(SFF_DPL_NAME));
177             serviceFunctionDictionaryBuilder.setSffSfDataPlaneLocator(sffSfDataPlaneLocatorBuilder.build());
178         }
179
180         if (hasDict) {
181             sffBuilder.setServiceFunctionDictionary(
182                     Collections.singletonList(serviceFunctionDictionaryBuilder.build()));
183         }
184
185         SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder();
186         DataPlaneLocatorBuilder dataPlaneLocatorBuilder = new DataPlaneLocatorBuilder();
187         if (createLogicalSfDpl) {
188             LogicalInterfaceBuilder liBuilder = new LogicalInterfaceBuilder();
189             liBuilder.setInterfaceName(LOGICAL_IF_NAME);
190             dataPlaneLocatorBuilder.setLocatorType(liBuilder.build());
191             sffDplBuilder.setDataPlaneLocator(dataPlaneLocatorBuilder.build());
192         }
193
194         if (createSffDpl) {
195             List<SffDataPlaneLocator> sffDpls = new ArrayList<>();
196             sffDplBuilder.setKey(new SffDataPlaneLocatorKey(new SffDataPlaneLocatorName(SFF_DPL_NAME)));
197             sffDplBuilder.setName(new SffDataPlaneLocatorName(SFF_DPL_NAME));
198             sffDpls.add(sffDplBuilder.build());
199             sffBuilder.setSffDataPlaneLocator(sffDpls);
200         }
201
202         if (createSff) {
203             sffBuilder.setName(sffName);
204             storeSff(sffName, sffBuilder.build());
205         }
206
207         return rspBuilder;
208     }
209
210     @SuppressWarnings("deprecation")
211     private void storeRsp(RspName rspName, RenderedServicePath rsp) {
212         InstanceIdentifier<RenderedServicePath> rspIid = InstanceIdentifier.builder(RenderedServicePaths.class)
213                 .child(RenderedServicePath.class, new RenderedServicePathKey(rspName)).build();
214
215         MDSALUtil.syncWrite(getDataBroker(), LogicalDatastoreType.OPERATIONAL, rspIid, rsp);
216     }
217
218     @SuppressWarnings("deprecation")
219     private void storeSff(SffName sffName, ServiceFunctionForwarder sff) {
220         InstanceIdentifier<ServiceFunctionForwarder> sffIid;
221         sffIid = InstanceIdentifier.builder(ServiceFunctionForwarders.class)
222                 .child(ServiceFunctionForwarder.class, new ServiceFunctionForwarderKey(sffName))
223                 .build();
224
225         MDSALUtil.syncWrite(getDataBroker(), LogicalDatastoreType.CONFIGURATION, sffIid, sff);
226     }
227 }