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