Handle nullable lists in natservice
[netvirt.git] / natservice / impl / src / main / java / org / opendaylight / netvirt / natservice / internal / SnatServiceImplFactory.java
1 /*
2  * Copyright (c) 2017 Red Hat, 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 package org.opendaylight.netvirt.natservice.internal;
9
10 import javax.annotation.Nullable;
11 import javax.inject.Inject;
12 import javax.inject.Singleton;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
15 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
16 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
17 import org.opendaylight.infrautils.inject.AbstractLifecycle;
18 import org.opendaylight.netvirt.elanmanager.api.IElanService;
19 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
20 import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
21 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
22 import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig.NatMode;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 @Singleton
32 public class SnatServiceImplFactory extends AbstractLifecycle {
33
34     private static final Logger LOG = LoggerFactory.getLogger(SnatServiceImplFactory.class);
35
36     private final DataBroker dataBroker;
37     private final IMdsalApiManager mdsalManager;
38     private final ItmRpcService itmManager;
39     private final OdlInterfaceRpcService odlInterfaceRpcService;
40     private final IdManagerService idManager;
41     private final NAPTSwitchSelector naptSwitchSelector;
42     private final NatMode natMode;
43     private final INeutronVpnManager nvpnManager;
44     private final ExternalRoutersListener externalRouterListener;
45     private final IElanService elanManager;
46     private final IInterfaceManager interfaceManager;
47     private final IVpnFootprintService vpnFootprintService;
48     private final IFibManager fibManager;
49     private final NatDataUtil natDataUtil;
50     private final DataTreeEventCallbackRegistrar eventCallbacks;
51
52     @Inject
53     public SnatServiceImplFactory(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
54                                   final ItmRpcService itmManager,
55                                   final OdlInterfaceRpcService odlInterfaceRpcService,
56                                   final IdManagerService idManager,
57                                   final NAPTSwitchSelector naptSwitchSelector,
58                                   final NatserviceConfig config,
59                                   final INeutronVpnManager nvpnManager,
60                                   final ExternalRoutersListener externalRouterListener,
61                                   final IElanService elanManager,
62                                   final IInterfaceManager interfaceManager,
63                                   final IVpnFootprintService vpnFootprintService,
64                                   final IFibManager fibManager,
65                                   final NatDataUtil natDataUtil,
66                                   final DataTreeEventCallbackRegistrar eventCallbacks) {
67         this.dataBroker = dataBroker;
68         this.mdsalManager = mdsalManager;
69         this.itmManager = itmManager;
70         this.odlInterfaceRpcService = odlInterfaceRpcService;
71         this.idManager = idManager;
72         this.naptSwitchSelector = naptSwitchSelector;
73         if (config != null) {
74             this.natMode = config.getNatMode();
75         } else {
76             this.natMode = null;
77         }
78         this.nvpnManager = nvpnManager;
79         this.externalRouterListener = externalRouterListener;
80         this.elanManager = elanManager;
81         this.interfaceManager = interfaceManager;
82         this.vpnFootprintService = vpnFootprintService;
83         this.fibManager = fibManager;
84         this.natDataUtil = natDataUtil;
85         this.eventCallbacks = eventCallbacks;
86     }
87
88     @Override
89     protected void start() {
90         LOG.info("{} start", getClass().getSimpleName());
91     }
92
93     @Override
94     protected void stop() {
95         LOG.info("{} close", getClass().getSimpleName());
96     }
97
98     @Nullable
99     public AbstractSnatService createFlatVlanSnatServiceImpl() {
100         if (natMode == NatMode.Conntrack) {
101             return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
102                     idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager,  natDataUtil,
103                     eventCallbacks);
104         }
105         return null;
106     }
107
108     @Nullable
109     public AbstractSnatService createVxlanGreSnatServiceImpl() {
110         if (natMode == NatMode.Conntrack) {
111             NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager, idManager,
112                     NatConstants.ODL_VNI_POOL_NAME);
113             return new VxlanGreConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
114                     idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager,
115                     vpnFootprintService, fibManager, natDataUtil, eventCallbacks);
116         }
117         return null;
118     }
119 }