implementing routing for VPP
[groupbasedpolicy.git] / neutron-mapper / src / test / java / org / opendaylight / groupbasedpolicy / neutron / mapper / mapping / NeutronRouterAwareDataStoreTest.java
1 /*
2  * Copyright (c) 2016 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.groupbasedpolicy.neutron.mapper.mapping;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotEquals;
13 import static org.junit.Assert.fail;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.when;
17
18 import java.util.concurrent.ExecutionException;
19 import java.util.concurrent.Future;
20
21 import com.google.common.base.Optional;
22 import com.google.common.collect.ImmutableList;
23 import org.junit.Before;
24 import org.junit.Rule;
25 import org.junit.Test;
26 import org.junit.rules.ExpectedException;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
29 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
30 import org.opendaylight.groupbasedpolicy.neutron.mapper.EndpointRegistrator;
31 import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest;
32 import org.opendaylight.groupbasedpolicy.neutron.mapper.util.Utils;
33 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
34 import org.opendaylight.groupbasedpolicy.util.IidFactory;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.Router;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.routers.RouterBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.NetworksBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.PortsBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.SubnetsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import org.opendaylight.yangtools.yang.common.RpcResult;
62
63 public class NeutronRouterAwareDataStoreTest extends NeutronMapperDataBrokerTest {
64
65     private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
66     private final Uuid routerUuid = new Uuid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb");
67     private final Uuid newRouterUuid = new Uuid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb2");
68     private final Uuid subnetUuid = new Uuid("cccccccc-cccc-cccc-cccc-cccccccccccc");
69     private final Uuid networkUuid = new Uuid("dddddddd-dddd-dddd-dddd-dddddddddddd");
70     private final Uuid gatewayPortUuid = new Uuid("dddddddd-dddd-dddd-dddd-ddddddddddd1");
71     private final IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2"));
72
73     private DataBroker dataBroker;
74     private NeutronRouterAware routerAware;
75     private EndpointRegistrator epRegistrator;
76     private EndpointService epService;
77     private BaseEndpointService baseEpService;
78     private Neutron neutron;
79     private Future<RpcResult<Void>> futureRpcResult;
80     private Future<RpcResult<Void>> futureRpcFail;
81     private RpcResult<Void> rpcResult;
82     private RpcResult<Void> rpcFail;
83     private NeutronNetworkAware networkAware;
84     private Network network;
85
86     @Before
87     public void init() throws ExecutionException, InterruptedException {
88         futureRpcResult = mock(Future.class);
89         futureRpcFail = mock(Future.class);
90         rpcResult = mock(RpcResult.class);
91         rpcFail = mock(RpcResult.class);
92         when(rpcResult.isSuccessful()).thenReturn(true);
93         when(rpcFail.isSuccessful()).thenReturn(false);
94         dataBroker = getDataBroker();
95         neutron = mock(Neutron.class);
96         epService = mock(EndpointService.class);
97         baseEpService = mock(BaseEndpointService.class);
98         when(futureRpcResult.get()).thenReturn(rpcResult);
99         when(futureRpcFail.get()).thenReturn(rpcFail);
100         when(epService.registerEndpoint(
101                 any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput.class)))
102                     .thenReturn(futureRpcResult);
103         when(epService.registerL3PrefixEndpoint(
104                 any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput.class)))
105                     .thenReturn(futureRpcResult);
106         when(baseEpService.registerEndpoint(
107                 any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.RegisterEndpointInput.class)))
108                     .thenReturn(futureRpcResult);
109         epRegistrator = new EndpointRegistrator(epService, baseEpService);
110
111         networkAware = new NeutronNetworkAware(dataBroker);
112         network = new NetworkBuilder().setTenantId(tenantUuid).setUuid(networkUuid).setName("networkName").build();
113
114         routerAware = new NeutronRouterAware(dataBroker, epRegistrator);
115     }
116
117     @Rule
118     public ExpectedException thrown = ExpectedException.none();
119
120     @Test
121     public void testConstructor_invalidArgument() throws NullPointerException {
122         thrown.expect(NullPointerException.class);
123         new NeutronRouterAware(null, null);
124     }
125
126     @Test
127     public void testOnCreated() {
128         Router router = new RouterBuilder().setTenantId(tenantUuid).setName("routerName").setUuid(routerUuid).build();
129
130         routerAware.onCreated(router, neutron);
131
132         assertRouterExists(router);
133     }
134
135     @Test
136     public void testOnCreated_incorrectName() {
137         Router router = new RouterBuilder().setTenantId(tenantUuid).setName("123").setUuid(routerUuid).build();
138
139         routerAware.onCreated(router, neutron);
140
141         assertRouterExists(router);
142     }
143
144     @Test
145     public void testOnUpdated() {
146         Subnets subnets = createSubnets();
147         when(neutron.getSubnets()).thenReturn(subnets);
148         when(neutron.getNetworks()).thenReturn(new NetworksBuilder().setNetwork(ImmutableList.of(network)).build());
149
150         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(ipAddress).setSubnetId(subnetUuid).build();
151         Port port = new PortBuilder().setUuid(gatewayPortUuid).setFixedIps(ImmutableList.of(fixedIps)).build();
152         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
153         when(neutron.getPorts()).thenReturn(ports);
154
155         Router oldRouter =
156                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
157         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
158             .setName("newRouterName")
159             .setUuid(newRouterUuid)
160             .setGatewayPortId(gatewayPortUuid)
161             .build();
162
163         networkAware.onCreated(network, neutron);
164
165         assertRouterNotExists(oldRouter);
166
167         routerAware.onCreated(oldRouter, neutron);
168
169         assertRouterExists(oldRouter);
170         assertRouterNotExists(newRouter);
171
172         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
173
174         assertRouterExists(oldRouter);
175         assertRouterExists(newRouter);
176     }
177
178     @Test
179     public void testOnUpdated_GatewayPortNotFound() {
180         Subnets subnets = createSubnets();
181         when(neutron.getSubnets()).thenReturn(subnets);
182
183         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(ipAddress).setSubnetId(subnetUuid).build();
184         Port port = new PortBuilder().setUuid(new Uuid("dddddddd-dddd-dddd-dddd-000000000000"))
185             .setFixedIps(ImmutableList.of(fixedIps))
186             .build();
187         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
188         when(neutron.getPorts()).thenReturn(ports);
189
190         Router oldRouter =
191                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
192         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
193             .setName("newRouterName")
194             .setUuid(newRouterUuid)
195             .setGatewayPortId(gatewayPortUuid)
196             .build();
197
198         routerAware.onCreated(oldRouter, neutron);
199         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
200
201         assertRouterNotExists(newRouter);
202     }
203
204     @Test
205     public void testOnUpdated_noIps() {
206         Subnets subnets = createSubnets();
207         when(neutron.getSubnets()).thenReturn(subnets);
208
209         Port port = new PortBuilder().setUuid(gatewayPortUuid).build();
210         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
211         when(neutron.getPorts()).thenReturn(ports);
212
213         Router oldRouter =
214                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
215         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
216             .setName("newRouterName")
217             .setUuid(newRouterUuid)
218             .setGatewayPortId(gatewayPortUuid)
219             .build();
220
221         routerAware.onCreated(oldRouter, neutron);
222         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
223
224         assertRouterNotExists(newRouter);
225     }
226
227     @Test
228     public void testOnUpdated_noSubnet() {
229         Subnets subnets = createSubnets();
230         when(neutron.getSubnets()).thenReturn(subnets);
231
232         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(ipAddress).build();
233         Port port = new PortBuilder().setUuid(gatewayPortUuid).setFixedIps(ImmutableList.of(fixedIps)).build();
234         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
235         when(neutron.getPorts()).thenReturn(ports);
236
237         Router oldRouter =
238                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
239         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
240             .setName("newRouterName")
241             .setUuid(newRouterUuid)
242             .setGatewayPortId(gatewayPortUuid)
243             .build();
244
245         routerAware.onCreated(oldRouter, neutron);
246         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
247
248         assertRouterNotExists(newRouter);
249     }
250
251     @Test
252     public void testOnUpdated_ExtGatewayNotRegistered() {
253         when(baseEpService.registerEndpoint(
254                 any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.RegisterEndpointInput.class)))
255                     .thenReturn(futureRpcFail);
256
257         Subnets subnets = createSubnets();
258         when(neutron.getSubnets()).thenReturn(subnets);
259
260         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(ipAddress).setSubnetId(subnetUuid).build();
261         Port port = new PortBuilder().setUuid(gatewayPortUuid).setFixedIps(ImmutableList.of(fixedIps)).build();
262         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
263         when(neutron.getPorts()).thenReturn(ports);
264
265         Router oldRouter =
266                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
267         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
268             .setName("newRouterName")
269             .setUuid(newRouterUuid)
270             .setGatewayPortId(gatewayPortUuid)
271             .build();
272
273         routerAware.onCreated(oldRouter, neutron);
274         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
275
276         assertRouterNotExists(newRouter);
277     }
278
279     @Test
280     public void testOnUpdated_noL2BridgeDomain() {
281         Subnets subnets = createSubnets();
282         when(neutron.getSubnets()).thenReturn(subnets);
283         when(neutron.getNetworks()).thenReturn(new NetworksBuilder().setNetwork(ImmutableList.of(network)).build());
284
285         FixedIps fixedIps = new FixedIpsBuilder().setIpAddress(ipAddress).setSubnetId(subnetUuid).build();
286         Port port = new PortBuilder().setUuid(gatewayPortUuid).setFixedIps(ImmutableList.of(fixedIps)).build();
287         Ports ports = new PortsBuilder().setPort(ImmutableList.of(port)).build();
288         when(neutron.getPorts()).thenReturn(ports);
289
290         Router oldRouter =
291                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
292         Router newRouter = new RouterBuilder().setTenantId(tenantUuid)
293             .setName("newRouterName")
294             .setUuid(newRouterUuid)
295             .setGatewayPortId(gatewayPortUuid)
296             .build();
297
298         routerAware.onCreated(oldRouter, neutron);
299         routerAware.onUpdated(oldRouter, newRouter, neutron, neutron);
300
301         assertRouterNotExists(newRouter);
302     }
303
304     @Test
305     public void testOnDeleted() {
306         Router router =
307                 new RouterBuilder().setTenantId(tenantUuid).setName("oldRouterName").setUuid(routerUuid).build();
308
309         routerAware.onCreated(router, neutron);
310         routerAware.onDeleted(router, neutron, neutron);
311         // no op
312     }
313
314     private Subnets createSubnets() {
315         Subnet subnet = new SubnetBuilder().setTenantId(tenantUuid)
316             .setUuid(subnetUuid)
317             .setName("subnetName")
318             .setNetworkId(networkUuid)
319             .setGatewayIp(ipAddress)
320             .setCidr(Utils.createIpPrefix("10.0.0.0/24"))
321             .build();
322         return new SubnetsBuilder().setSubnet(ImmutableList.of(subnet)).build();
323     }
324
325     private void assertRouterExists(Router router) {
326         Optional<L3Context> opt = getL3ContextOptional(router);
327         if (opt.isPresent()) {
328             assertEquals(router.getUuid().getValue(), opt.get().getId().getValue());
329         } else {
330             fail("no router in DS, Uuid:" + router.getUuid());
331         }
332     }
333
334     private void assertRouterNotExists(Router router) {
335         Optional<L3Context> opt = getL3ContextOptional(router);
336         if (opt.isPresent()) {
337             assertNotEquals(router.getUuid().getValue(), opt.get().getId().getValue());
338         }
339     }
340
341     private Optional<L3Context> getL3ContextOptional(Router router) {
342         ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();
343         TenantId tenantId = new TenantId(router.getTenantId().getValue());
344         ContextId routerL3CtxId = new ContextId(router.getUuid().getValue());
345         L3ContextId l3ContextId = new L3ContextId(routerL3CtxId);
346         InstanceIdentifier<L3Context> l3ContextIid = IidFactory.l3ContextIid(tenantId, l3ContextId);
347         return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, l3ContextIid, rTx);
348     }
349
350 }