c1a3054a08b59d204fb46fd826c6d906cd2a72ef
[sfc.git] /
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.sfc.provider.api;
10
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;
46
47 import java.util.ArrayList;
48 import java.util.List;
49 import java.util.concurrent.ExecutionException;
50
51 import static org.junit.Assert.*;
52
53 /**
54  * Tests for simple data store operations on SFFs (i.e. Service Functions are created first)
55  */
56
57 public class SfcProviderServiceForwarderAPISimpleIPv6GTest extends AbstractDataStoreManager {
58
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<>();
80
81     @Before
82     public void before() throws ExecutionException, InterruptedException {
83         setOdlSfc();
84
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]);
95
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();
101
102             ServiceFunctionBuilder sfBuilder = new ServiceFunctionBuilder();
103             List<SfDataPlaneLocator> dataPlaneLocatorList = new ArrayList<>();
104             dataPlaneLocatorList.add(sfDataPlaneLocator[i]);
105             sfBuilder.setName(sfNames[i]).setKey(key[i])
106                     .setType(sfTypes[i])
107                     .setIpMgmtAddress(ipMgmtAddress[i])
108                     .setSfDataPlaneLocator(dataPlaneLocatorList);
109             sfList.add(sfBuilder.build());
110         }
111
112         ServiceFunctionsBuilder sfsBuilder = new ServiceFunctionsBuilder();
113         sfsBuilder.setServiceFunction(sfList);
114
115         executor.submit(SfcProviderServiceFunctionAPI.getPutAll(new Object[]{sfsBuilder.build()}, new Class[]{ServiceFunctions.class})).get();
116         Thread.sleep(1000); // Wait they are really created
117
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);
123         }
124
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);
132             }
133
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);
148
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();
170         }
171
172         //Create Service Function Chain
173         ServiceFunctionChainKey sfcKey = new ServiceFunctionChainKey(SFC_NAME);
174         List<SfcServiceFunction> sfcServiceFunctionList = new ArrayList<>();
175
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]))
181                             .setType(sfTypes[i])
182                             .build();
183             sfcServiceFunctionList.add(sfcServiceFunction);
184         }
185         ServiceFunctionChainBuilder sfcBuilder = new ServiceFunctionChainBuilder();
186         sfcBuilder.setName(SFC_NAME).setKey(sfcKey)
187                 .setSfcServiceFunction(sfcServiceFunctionList)
188                 .setSymmetric(true);
189
190         Object[] parameters = {sfcBuilder.build()};
191         Class[] parameterTypes = {ServiceFunctionChain.class};
192
193         executor.submit(SfcProviderServiceChainAPI
194                 .getPut(parameters, parameterTypes)).get();
195         Thread.sleep(1000); // Wait SFC is really crated
196
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;
203
204         assertNotNull("Must be not null", sfc2);
205         assertEquals("Must be equal", sfc2.getSfcServiceFunction(), sfcServiceFunctionList);
206
207         /* Create ServiceFunctionPath */
208         ServiceFunctionPathBuilder pathBuilder = new ServiceFunctionPathBuilder();
209         pathBuilder.setName(SFP_NAME)
210                 .setServiceChainName(SFC_NAME)
211                 .setSymmetric(true);
212         ServiceFunctionPath serviceFunctionPath = pathBuilder.build();
213         assertNotNull("Must be not null", serviceFunctionPath);
214         boolean ret = SfcProviderServicePathAPI.putServiceFunctionPathExecutor(serviceFunctionPath);
215         assertTrue("Must be true", ret);
216
217         Thread.sleep(1000); // Wait they are really created
218     }
219
220     @Test
221     public void testCreateReadUpdateServiceFunctionForwarder() throws ExecutionException, InterruptedException {
222
223         String name = sffName[0];
224
225         List<SffDataPlaneLocator> locatorList = new ArrayList<>();
226
227
228         IpBuilder ipBuilder = new IpBuilder();
229         ipBuilder.setIp(new IpAddress(new Ipv6Address("3ffe:b00:1:2::5efe:c000:0202")))
230                 .setPort(new PortNumber(555));
231
232         DataPlaneLocatorBuilder sffLocatorBuilder = new DataPlaneLocatorBuilder();
233         sffLocatorBuilder.setLocatorType(ipBuilder.build())
234                 .setTransport(VxlanGpe.class);
235
236         SffDataPlaneLocatorBuilder locatorBuilder = new SffDataPlaneLocatorBuilder();
237         locatorBuilder.setName("locator-1").setKey(new SffDataPlaneLocatorKey("locator-1"))
238                 .setDataPlaneLocator(sffLocatorBuilder.build());
239
240         locatorList.add(locatorBuilder.build());
241
242
243         List<ServiceFunctionDictionary> dictionary = new ArrayList<>();
244
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);
256
257         ServiceFunctionDictionary dictionaryEntry = dictionaryEntryBuilder.build();
258         dictionary.add(dictionaryEntry);
259
260         ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
261
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
267                         .build();
268
269         Object[] parameters = {sff};
270         Class[] parameterTypes = {ServiceFunctionForwarder.class};
271
272         executor.submit(SfcProviderServiceForwarderAPI
273                 .getPut(parameters, parameterTypes)).get();
274
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;
280
281         assertNotNull("Must be not null", sff2);
282         assertEquals("Must be equal", sff2.getSffDataPlaneLocator(), locatorList);
283         assertEquals("Must be equal", sff2.getServiceFunctionDictionary(), dictionary);
284     }
285 }