NETVIRT-1630 migrate to md-sal APIs
[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.inject.Inject;
11 import javax.inject.Singleton;
12 import org.eclipse.jdt.annotation.Nullable;
13 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
14 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
15 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
16 import org.opendaylight.infrautils.inject.AbstractLifecycle;
17 import org.opendaylight.mdsal.binding.api.DataBroker;
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.vpnmanager.api.IVpnFootprintService;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig.NatMode;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 @Singleton
31 public class SnatServiceImplFactory extends AbstractLifecycle {
32
33     private static final Logger LOG = LoggerFactory.getLogger(SnatServiceImplFactory.class);
34
35     private final DataBroker dataBroker;
36     private final IMdsalApiManager mdsalManager;
37     private final ItmRpcService itmManager;
38     private final OdlInterfaceRpcService odlInterfaceRpcService;
39     private final IdManagerService idManager;
40     private final NAPTSwitchSelector naptSwitchSelector;
41     private final NatMode natMode;
42     private final ExternalRoutersListener externalRouterListener;
43     private final IElanService elanManager;
44     private final IInterfaceManager interfaceManager;
45     private final IVpnFootprintService vpnFootprintService;
46     private final IFibManager fibManager;
47     private final NatDataUtil natDataUtil;
48     private final DataTreeEventCallbackRegistrar eventCallbacks;
49     private final NatOverVxlanUtil natOverVxlanUtil;
50     private final Ipv6SubnetFlowProgrammer ipv6SubnetFlowProgrammer;
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 ExternalRoutersListener externalRouterListener,
60                                   final IElanService elanManager,
61                                   final IInterfaceManager interfaceManager,
62                                   final IVpnFootprintService vpnFootprintService,
63                                   final IFibManager fibManager,
64                                   final NatDataUtil natDataUtil,
65                                   final DataTreeEventCallbackRegistrar eventCallbacks,
66                                   final NatOverVxlanUtil natOverVxlanUtil,
67                                   final Ipv6SubnetFlowProgrammer ipv6SubnetFlowProgrammer) {
68         this.dataBroker = dataBroker;
69         this.mdsalManager = mdsalManager;
70         this.itmManager = itmManager;
71         this.odlInterfaceRpcService = odlInterfaceRpcService;
72         this.idManager = idManager;
73         this.naptSwitchSelector = naptSwitchSelector;
74         if (config != null) {
75             this.natMode = config.getNatMode();
76         } else {
77             this.natMode = null;
78         }
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         this.natOverVxlanUtil = natOverVxlanUtil;
87         this.ipv6SubnetFlowProgrammer = ipv6SubnetFlowProgrammer;
88     }
89
90     @Override
91     protected void start() {
92         LOG.info("{} start", getClass().getSimpleName());
93     }
94
95     @Override
96     protected void stop() {
97         LOG.info("{} close", getClass().getSimpleName());
98     }
99
100     @Nullable
101     public AbstractSnatService createFlatVlanSnatServiceImpl() {
102         if (natMode == NatMode.Conntrack) {
103             return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
104                     idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager,  natDataUtil,
105                     eventCallbacks);
106         }
107         return null;
108     }
109
110     public Ipv6ForwardingService createFlatVlanIpv6ServiceImpl() {
111         return new Ipv6ForwardingService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
112                 idManager, naptSwitchSelector, interfaceManager, ipv6SubnetFlowProgrammer);
113     }
114
115     @Nullable
116     public AbstractSnatService createVxlanGreSnatServiceImpl() {
117         if (natMode == NatMode.Conntrack) {
118             return new VxlanGreConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
119                     idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager,
120                     vpnFootprintService, fibManager, natDataUtil, eventCallbacks, natOverVxlanUtil);
121         }
122         return null;
123     }
124 }