2 * Copyright (c) 2015 Cisco Systems, 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.sfc.provider.api;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.opendaylight.sfc.provider.AbstractDataStoreManager;
14 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.ServiceFunctions;
15 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.ServiceFunctionsBuilder;
16 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.entry.SfDataPlaneLocator;
17 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.entry.SfDataPlaneLocatorBuilder;
18 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
19 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
21 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
22 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainBuilder;
23 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunction;
25 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionKey;
27 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.Open;
28 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
29 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
30 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
31 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.*;
32 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocator;
33 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;
34 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.DataPlaneLocatorBuilder;
35 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
36 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder;
37 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.*;
38 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
39 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 import java.util.ArrayList;
48 import java.util.List;
49 import java.util.concurrent.ExecutionException;
51 import static org.junit.Assert.*;
54 * Tests for simple data store operations on SFFs (i.e. Service Functions are created first)
57 public class SfcProviderServiceForwarderAPISimpleIPv6GTest extends AbstractDataStoreManager {
59 private static final String[] LOCATOR_IP_ADDRESS =
60 {"3ffe:b00:1:2::5efe:c000:0201", "affe:b00:1:2::5efe:c000:0201", "bffe:b00:1:2::5efe:c000:0201",
61 "cffe:b00:1:2::5efe:c000:0201", "dffe:b00:1:2::5efe:c000:0201"};
62 private static final String[] IP_MGMT_ADDRESS =
63 {"196.168.55.101", "196.168.55.102", "196.168.55.103",
64 "196.168.55.104", "196.168.55.105"};
65 private static final int[] PORT = {1111, 2222, 3333, 4444, 5555};
66 private static final Class[] sfTypes = {Firewall.class, Dpi.class, Napt44.class, HttpHeaderEnrichment.class, Qos.class};
67 private static final String[] SF_ABSTRACT_NAMES = {"firewall", "dpi", "napt", "http-header-enrichment", "qos"};
68 private static final String SFC_NAME = "unittest-chain-1";
69 private static final String SFP_NAME = "unittest-sfp-1";
70 private static final String RSP_NAME = "unittest-rsp-1";
71 private static final Logger LOG = LoggerFactory.getLogger(SfcProviderServiceChainAPITest.class);
72 private static final String[] sfNames = {"unittest-fw-1", "unittest-dpi-1", "unittest-napt-1", "unittest-http-header-enrichment-1", "unittest-qos-1"};
73 private final String[] SFF_NAMES = {"SFF1", "SFF2", "SFF3", "SFF4", "SFF5"};
74 private final String[][] TO_SFF_NAMES =
75 {{"SFF2", "SFF5"}, {"SFF3", "SFF1"}, {"SFF4", "SFF2"}, {"SFF5", "SFF3"}, {"SFF1", "SFF4"}};
76 private final String[] SFF_LOCATOR_IP =
77 {"196.168.66.101", "196.168.66.102", "196.168.66.103", "196.168.66.104", "196.168.66.105"};
78 private final String[] sffName = {"unittest-forwarder-1", "unittest-forwarder-2", "unittest-forwarder-3"};
79 private List<ServiceFunction> sfList = new ArrayList<>();
82 public void before() throws ExecutionException, InterruptedException {
85 // Create Service Functions
86 final IpAddress[] ipMgmtAddress = new IpAddress[sfNames.length];
87 final IpAddress[] locatorIpAddress = new IpAddress[sfNames.length];
88 SfDataPlaneLocator[] sfDataPlaneLocator = new SfDataPlaneLocator[sfNames.length];
89 ServiceFunctionKey[] key = new ServiceFunctionKey[sfNames.length];
90 for (int i = 0; i < sfNames.length; i++) {
91 ipMgmtAddress[i] = new IpAddress(new Ipv4Address(IP_MGMT_ADDRESS[0]));
92 locatorIpAddress[i] = new IpAddress(new Ipv6Address(LOCATOR_IP_ADDRESS[0]));
93 PortNumber portNumber = new PortNumber(PORT[i]);
94 key[i] = new ServiceFunctionKey(sfNames[i]);
96 IpBuilder ipBuilder = new IpBuilder();
97 ipBuilder.setIp(locatorIpAddress[i]).setPort(portNumber);
98 SfDataPlaneLocatorBuilder locatorBuilder = new SfDataPlaneLocatorBuilder();
99 locatorBuilder.setName(LOCATOR_IP_ADDRESS[i]).setLocatorType(ipBuilder.build()).setServiceFunctionForwarder(SFF_NAMES[i]);
100 sfDataPlaneLocator[i] = locatorBuilder.build();
102 ServiceFunctionBuilder sfBuilder = new ServiceFunctionBuilder();
103 List<SfDataPlaneLocator> dataPlaneLocatorList = new ArrayList<>();
104 dataPlaneLocatorList.add(sfDataPlaneLocator[i]);
105 sfBuilder.setName(sfNames[i]).setKey(key[i])
107 .setIpMgmtAddress(ipMgmtAddress[i])
108 .setSfDataPlaneLocator(dataPlaneLocatorList);
109 sfList.add(sfBuilder.build());
112 ServiceFunctionsBuilder sfsBuilder = new ServiceFunctionsBuilder();
113 sfsBuilder.setServiceFunction(sfList);
115 executor.submit(SfcProviderServiceFunctionAPI.getPutAll(new Object[]{sfsBuilder.build()}, new Class[]{ServiceFunctions.class})).get();
116 Thread.sleep(1000); // Wait they are really created
118 // Create ServiceFunctionTypeEntry for all ServiceFunctions
119 for (ServiceFunction serviceFunction : sfList) {
120 boolean ret = SfcProviderServiceTypeAPI.createServiceFunctionTypeEntryExecutor(serviceFunction);
121 LOG.debug("call createServiceFunctionTypeEntryExecutor for {}", serviceFunction.getName());
122 assertTrue("Must be true", ret);
125 // Create Service Function Forwarders
126 for (int i = 0; i < SFF_NAMES.length; i++) {
127 List<ConnectedSffDictionary> sffDictionaryList = new ArrayList<>();
128 for (int j = 0; j < 2; j++) {
129 ConnectedSffDictionaryBuilder sffDictionaryEntryBuilder = new ConnectedSffDictionaryBuilder();
130 ConnectedSffDictionary sffDictEntry = sffDictionaryEntryBuilder.setName(TO_SFF_NAMES[i][j]).build();
131 sffDictionaryList.add(sffDictEntry);
134 List<ServiceFunctionDictionary> sfDictionaryList = new ArrayList<>();
135 ServiceFunction serviceFunction = sfList.get(i);
136 SfDataPlaneLocator sfDPLocator = serviceFunction.getSfDataPlaneLocator().get(0);
137 SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder(sfDPLocator);
138 SffSfDataPlaneLocator sffSfDataPlaneLocator = sffSfDataPlaneLocatorBuilder.build();
139 ServiceFunctionDictionaryBuilder dictionaryEntryBuilder = new ServiceFunctionDictionaryBuilder();
140 dictionaryEntryBuilder.setName(serviceFunction.getName())
141 .setKey(new ServiceFunctionDictionaryKey(serviceFunction.getName()))
142 .setType(serviceFunction.getType())
143 .setSffSfDataPlaneLocator(sffSfDataPlaneLocator)
144 .setFailmode(Open.class)
145 .setSffInterfaces(null);
146 ServiceFunctionDictionary sfDictEntry = dictionaryEntryBuilder.build();
147 sfDictionaryList.add(sfDictEntry);
149 List<SffDataPlaneLocator> locatorList = new ArrayList<>();
150 IpBuilder ipBuilder = new IpBuilder();
151 ipBuilder.setIp(new IpAddress(new Ipv4Address(SFF_LOCATOR_IP[i])))
152 .setPort(new PortNumber(PORT[i]));
153 DataPlaneLocatorBuilder sffLocatorBuilder = new DataPlaneLocatorBuilder();
154 sffLocatorBuilder.setLocatorType(ipBuilder.build())
155 .setTransport(VxlanGpe.class);
156 SffDataPlaneLocatorBuilder locatorBuilder = new SffDataPlaneLocatorBuilder();
157 locatorBuilder.setName(SFF_LOCATOR_IP[i])
158 .setKey(new SffDataPlaneLocatorKey(SFF_LOCATOR_IP[i]))
159 .setDataPlaneLocator(sffLocatorBuilder.build());
160 locatorList.add(locatorBuilder.build());
161 ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
162 sffBuilder.setName(SFF_NAMES[i])
163 .setKey(new ServiceFunctionForwarderKey(SFF_NAMES[i]))
164 .setSffDataPlaneLocator(locatorList)
165 .setServiceFunctionDictionary(sfDictionaryList)
166 .setConnectedSffDictionary(sffDictionaryList)
167 .setServiceNode(null);
168 ServiceFunctionForwarder sff = sffBuilder.build();
169 executor.submit(SfcProviderServiceForwarderAPI.getPut(new Object[]{sff}, new Class[]{ServiceFunctionForwarder.class})).get();
172 //Create Service Function Chain
173 ServiceFunctionChainKey sfcKey = new ServiceFunctionChainKey(SFC_NAME);
174 List<SfcServiceFunction> sfcServiceFunctionList = new ArrayList<>();
176 for (int i = 0; i < SF_ABSTRACT_NAMES.length; i++) {
177 SfcServiceFunctionBuilder sfcSfBuilder = new SfcServiceFunctionBuilder();
178 SfcServiceFunction sfcServiceFunction =
179 sfcSfBuilder.setName(SF_ABSTRACT_NAMES[i])
180 .setKey(new SfcServiceFunctionKey(SF_ABSTRACT_NAMES[i]))
183 sfcServiceFunctionList.add(sfcServiceFunction);
185 ServiceFunctionChainBuilder sfcBuilder = new ServiceFunctionChainBuilder();
186 sfcBuilder.setName(SFC_NAME).setKey(sfcKey)
187 .setSfcServiceFunction(sfcServiceFunctionList)
190 Object[] parameters = {sfcBuilder.build()};
191 Class[] parameterTypes = {ServiceFunctionChain.class};
193 executor.submit(SfcProviderServiceChainAPI
194 .getPut(parameters, parameterTypes)).get();
195 Thread.sleep(1000); // Wait SFC is really crated
197 //Check if Service Function Chain was created
198 Object[] parameters2 = {SFC_NAME};
199 Class[] parameterTypes2 = {String.class};
200 Object result = executor.submit(SfcProviderServiceChainAPI
201 .getRead(parameters2, parameterTypes2)).get();
202 ServiceFunctionChain sfc2 = (ServiceFunctionChain) result;
204 assertNotNull("Must be not null", sfc2);
205 assertEquals("Must be equal", sfc2.getSfcServiceFunction(), sfcServiceFunctionList);
207 /* Create ServiceFunctionPath */
208 ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder();
209 pathBuilder.setName(SFP_NAME)
210 .setServiceChainName(SFC_NAME)
212 ServiceFunctionPath serviceFunctionPath = pathBuilder.build();
213 assertNotNull("Must be not null", serviceFunctionPath);
214 boolean ret = SfcProviderServicePathAPI.putServiceFunctionPathExecutor(serviceFunctionPath);
215 assertTrue("Must be true", ret);
217 Thread.sleep(1000); // Wait they are really created
221 public void testCreateReadUpdateServiceFunctionForwarder() throws ExecutionException, InterruptedException {
223 String name = sffName[0];
225 List<SffDataPlaneLocator> locatorList = new ArrayList<>();
228 IpBuilder ipBuilder = new IpBuilder();
229 ipBuilder.setIp(new IpAddress(new Ipv6Address("3ffe:b00:1:2::5efe:c000:0202")))
230 .setPort(new PortNumber(555));
232 DataPlaneLocatorBuilder sffLocatorBuilder = new DataPlaneLocatorBuilder();
233 sffLocatorBuilder.setLocatorType(ipBuilder.build())
234 .setTransport(VxlanGpe.class);
236 SffDataPlaneLocatorBuilder locatorBuilder = new SffDataPlaneLocatorBuilder();
237 locatorBuilder.setName("locator-1").setKey(new SffDataPlaneLocatorKey("locator-1"))
238 .setDataPlaneLocator(sffLocatorBuilder.build());
240 locatorList.add(locatorBuilder.build());
243 List<ServiceFunctionDictionary> dictionary = new ArrayList<>();
245 ServiceFunction sf = sfList.get(0);
246 SfDataPlaneLocator sfDPLocator = sf.getSfDataPlaneLocator().get(0);
247 SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder(sfDPLocator);
248 SffSfDataPlaneLocator sffSfDataPlaneLocator = sffSfDataPlaneLocatorBuilder.build();
249 ServiceFunctionDictionaryBuilder dictionaryEntryBuilder = new ServiceFunctionDictionaryBuilder();
250 dictionaryEntryBuilder
251 .setName(sf.getName()).setKey(new ServiceFunctionDictionaryKey(sf.getName()))
252 .setType(sf.getType())
253 .setSffSfDataPlaneLocator(sffSfDataPlaneLocator)
254 .setFailmode(Open.class)
255 .setSffInterfaces(null);
257 ServiceFunctionDictionary dictionaryEntry = dictionaryEntryBuilder.build();
258 dictionary.add(dictionaryEntry);
260 ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
262 ServiceFunctionForwarder sff =
263 sffBuilder.setName(name).setKey(new ServiceFunctionForwarderKey(name))
264 .setSffDataPlaneLocator(locatorList)
265 .setServiceFunctionDictionary(dictionary)
266 .setServiceNode(null) // for consistency only; we are going to get rid of ServiceNodes in the future
269 Object[] parameters = {sff};
270 Class[] parameterTypes = {ServiceFunctionForwarder.class};
272 executor.submit(SfcProviderServiceForwarderAPI
273 .getPut(parameters, parameterTypes)).get();
275 Object[] parameters2 = {name};
276 Class[] parameterTypes2 = {String.class};
277 Object result = executor.submit(SfcProviderServiceForwarderAPI
278 .getRead(parameters2, parameterTypes2)).get();
279 ServiceFunctionForwarder sff2 = (ServiceFunctionForwarder) result;
281 assertNotNull("Must be not null", sff2);
282 assertEquals("Must be equal", sff2.getSffDataPlaneLocator(), locatorList);
283 assertEquals("Must be equal", sff2.getServiceFunctionDictionary(), dictionary);