2 * Copyright © 2017 Ericsson, Inc. and others. All rights reserved.
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
9 package org.opendaylight.netvirt.sfc.classifier.providers;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
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;
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);
58 private SfcProvider sfcProvider;
61 public void setUp() throws Exception {
62 sfcProvider = new SfcProvider(getDataBroker());
66 public void getRenderedServicePath() {
67 RspName rspName = new RspName(RSP_NAME);
68 RenderedServicePathBuilder rspBuilder = createRsp(rspName);
69 storeRsp(rspName, rspBuilder.build());
71 Optional<RenderedServicePath> rspOptional = this.sfcProvider.getRenderedServicePath(RSP_NAME);
72 assertTrue(rspOptional.isPresent());
76 public void getRenderedServicePathNonExistantRsp() {
77 Optional<RenderedServicePath> rspOptional = this.sfcProvider.getRenderedServicePath(RSP_NAME_NOEXIST);
78 assertFalse(rspOptional.isPresent());
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());
89 public void getFirstHopSfInterfaceFromRsp() {
90 RspName rspName = new RspName(RSP_NAME);
92 // Check RSP with no hops
93 RenderedServicePathBuilder rspBuilder = createRsp(rspName);
94 Optional<String> ifName = this.sfcProvider.getFirstHopIngressInterfaceFromRsp(rspBuilder.build());
95 assertFalse(ifName.isPresent());
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());
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());
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());
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());
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());
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());
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());
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);
139 private RenderedServicePathBuilder createRsp(RspName rspName) {
140 return new RenderedServicePathBuilder()
142 .setServiceChainName(SfcName.getDefaultInstance(SFC_NAME))
144 .setReversePath(false);
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);
155 RenderedServicePathHopBuilder rspHopBuilder = new RenderedServicePathHopBuilder();
157 rspHopBuilder.setServiceFunctionName(sfName);
161 rspHopBuilder.setServiceFunctionForwarder(sffName);
165 List<RenderedServicePathHop> hops = new ArrayList<>();
166 hops.add(rspHopBuilder.build());
167 rspBuilder.setRenderedServicePathHop(hops);
170 ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
171 ServiceFunctionDictionaryBuilder serviceFunctionDictionaryBuilder = new ServiceFunctionDictionaryBuilder();
172 serviceFunctionDictionaryBuilder.setName(sfName);
175 SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder();
176 sffSfDataPlaneLocatorBuilder.setSffDplName(new SffDataPlaneLocatorName(SFF_DPL_NAME));
177 serviceFunctionDictionaryBuilder.setSffSfDataPlaneLocator(sffSfDataPlaneLocatorBuilder.build());
181 sffBuilder.setServiceFunctionDictionary(
182 Collections.singletonList(serviceFunctionDictionaryBuilder.build()));
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());
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);
203 sffBuilder.setName(sffName);
204 storeSff(sffName, sffBuilder.build());
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();
215 MDSALUtil.syncWrite(getDataBroker(), LogicalDatastoreType.OPERATIONAL, rspIid, rsp);
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))
225 MDSALUtil.syncWrite(getDataBroker(), LogicalDatastoreType.CONFIGURATION, sffIid, sff);