Working with OVS
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / InterfacemgrProvider.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.interfacemgr;
9
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
12 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
13 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
14 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
15 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
16 import org.opendaylight.idmanager.IdManager;
17 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceConfigListener;
18 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceInventoryStateListener;
19 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceTopologyStateListener;
20 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
21 import org.opendaylight.vpnservice.interfacemgr.rpcservice.InterfaceManagerRpcService;
22 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.listeners.FlowBasedServicesConfigListener;
23 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.listeners.FlowBasedServicesInterfaceStateListener;
24 import org.opendaylight.vpnservice.interfacemgr.listeners.VlanMemberConfigListener;
25 import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
26 import org.opendaylight.vpnservice.mdsalutil.MatchInfo;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.*;
32 import org.opendaylight.yangtools.yang.common.RpcResult;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 import java.math.BigInteger;
37 import java.util.List;
38 import java.util.concurrent.ExecutionException;
39 import java.util.concurrent.Future;
40
41 public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable, IInterfaceManager {
42
43     private static final Logger LOG = LoggerFactory.getLogger(InterfacemgrProvider.class);
44
45     private RpcProviderRegistry rpcProviderRegistry;
46
47     private InterfaceManager interfaceManager;
48     private IfmNodeConnectorListener ifmNcListener;
49     private IdManager idManager;
50
51     private InterfaceConfigListener interfaceConfigListener;
52     private InterfaceTopologyStateListener topologyStateListener;
53     private InterfaceInventoryStateListener interfaceInventoryStateListener;
54     private FlowBasedServicesInterfaceStateListener flowBasedServicesInterfaceStateListener;
55     private FlowBasedServicesConfigListener flowBasedServicesConfigListener;
56     private VlanMemberConfigListener vlanMemberConfigListener;
57
58     private InterfaceManagerRpcService interfaceManagerRpcService;
59     private BindingAwareBroker.RpcRegistration<OdlInterfaceRpcService> rpcRegistration;
60
61     public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
62         this.rpcProviderRegistry = rpcProviderRegistry;
63     }
64
65     @Override
66     public void onSessionInitiated(ProviderContext session) {
67         LOG.info("InterfacemgrProvider Session Initiated");
68         try {
69             final  DataBroker dataBroker = session.getSALService(DataBroker.class);
70             idManager = new IdManager(dataBroker);
71             createIdPool();
72
73             interfaceManagerRpcService = new InterfaceManagerRpcService(dataBroker);
74             rpcRegistration = getRpcProviderRegistry().addRpcImplementation(
75                     OdlInterfaceRpcService.class, interfaceManagerRpcService);
76
77             interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager);
78             interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
79
80             interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker);
81             interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
82
83             topologyStateListener = new InterfaceTopologyStateListener(dataBroker);
84             topologyStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
85
86             flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(dataBroker);
87             flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
88
89             flowBasedServicesInterfaceStateListener =
90                     new FlowBasedServicesInterfaceStateListener(dataBroker);
91             flowBasedServicesInterfaceStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
92
93             vlanMemberConfigListener =
94                                new VlanMemberConfigListener(dataBroker, idManager);
95             vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
96
97
98             /*interfaceManager = new InterfaceManager(dataBroker, idManager);
99             ifmNcListener = new IfmNodeConnectorListener(dataBroker, interfaceManager);*/
100         } catch (Exception e) {
101             LOG.error("Error initializing services", e);
102         }
103     }
104
105     private void createIdPool() {
106         CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
107             .setPoolName(IfmConstants.IFM_IDPOOL_NAME)
108             .setIdStart(IfmConstants.IFM_IDPOOL_START)
109             .setPoolSize(new BigInteger(IfmConstants.IFM_IDPOOL_SIZE))
110             .build();
111         //TODO: Error handling
112         Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
113         try {
114             if ((result != null) && (result.get().isSuccessful())) {
115                 LOG.debug("Created IdPool for InterfaceMgr");
116             }
117         } catch (InterruptedException | ExecutionException e) {
118             LOG.error("Failed to create idPool for InterfaceMgr",e);
119         }
120     }
121
122     @Override
123     public void close() throws Exception {
124         LOG.info("InterfacemgrProvider Closed");
125         interfaceManager.close();
126         ifmNcListener.close();
127         interfaceConfigListener.close();
128         rpcRegistration.close();
129     }
130
131     public RpcProviderRegistry getRpcProviderRegistry() {
132         return rpcProviderRegistry;
133     }
134
135     @Override
136     public Long getPortForInterface(String ifName) {
137         GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(ifName).build();
138         Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
139         try {
140             RpcResult<GetPortFromInterfaceOutput> port = output.get();
141             if(port.isSuccessful()){
142                 return port.getResult().getPortno();
143             }
144         }catch(NullPointerException | InterruptedException | ExecutionException e){
145             LOG.warn("Exception when getting port for interface",e);
146         }
147         return null;
148     }
149
150     @Override
151     public Long getPortForInterface(Interface intf) {
152         GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(intf.getName()).build();
153         Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
154         try {
155             RpcResult<GetPortFromInterfaceOutput> port = output.get();
156             if(port.isSuccessful()){
157                 return port.getResult().getPortno();
158             }
159         }catch(NullPointerException | InterruptedException | ExecutionException e){
160             LOG.warn("Exception when getting port for interface",e);
161         }
162         return null;
163     }
164
165     @Override
166     public BigInteger getDpnForInterface(String ifName) {
167         GetDpidFromInterfaceInput input = new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
168         Future<RpcResult<GetDpidFromInterfaceOutput>> output = interfaceManagerRpcService.getDpidFromInterface(input);
169         try {
170             RpcResult<GetDpidFromInterfaceOutput> dpn = output.get();
171             if(dpn.isSuccessful()){
172                 return dpn.getResult().getDpid();
173             }
174         }catch(NullPointerException | InterruptedException | ExecutionException e){
175             LOG.warn("Exception when getting port for interface",e);
176         }
177         return null;
178     }
179
180     @Override
181     public String getEndpointIpForDpn(BigInteger dpnId) {
182         GetEndpointIpForDpnInput input = new GetEndpointIpForDpnInputBuilder().setDpid(dpnId).build();
183         Future<RpcResult<GetEndpointIpForDpnOutput>> output = interfaceManagerRpcService.getEndpointIpForDpn(input);
184         try {
185             RpcResult<GetEndpointIpForDpnOutput> ipForDpnOutputRpcResult = output.get();
186             if(ipForDpnOutputRpcResult.isSuccessful()){
187                 List<IpAddress> localIps = ipForDpnOutputRpcResult.getResult().getLocalIps();
188                 if(!localIps.isEmpty()) {
189                     return localIps.get(0).getIpv4Address().getValue();
190                 }
191             }
192         }catch(NullPointerException | InterruptedException | ExecutionException e){
193             LOG.warn("Exception when getting port for interface",e);
194         }
195         return null;
196     }
197
198     @Override
199     public List<MatchInfo> getInterfaceIngressRule(String ifName) {
200         return interfaceManager.getInterfaceIngressRule(ifName);
201     }
202
203     @Override
204     public List<ActionInfo> getInterfaceEgressActions(String ifName) {
205         return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName);
206     }
207
208     @Override
209     public BigInteger getDpnForInterface(Interface intrf) {
210         return getDpnForInterface(intrf.getName());
211     }
212 }