b2003ff79792881a809f235892b818adf0cc99a8
[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     private IdManager idManager;
47
48     private InterfaceConfigListener interfaceConfigListener;
49     private InterfaceTopologyStateListener topologyStateListener;
50     private InterfaceInventoryStateListener interfaceInventoryStateListener;
51     private FlowBasedServicesInterfaceStateListener flowBasedServicesInterfaceStateListener;
52     private FlowBasedServicesConfigListener flowBasedServicesConfigListener;
53     private VlanMemberConfigListener vlanMemberConfigListener;
54
55     private InterfaceManagerRpcService interfaceManagerRpcService;
56     private BindingAwareBroker.RpcRegistration<OdlInterfaceRpcService> rpcRegistration;
57
58     public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
59         this.rpcProviderRegistry = rpcProviderRegistry;
60     }
61
62     @Override
63     public void onSessionInitiated(ProviderContext session) {
64         LOG.info("InterfacemgrProvider Session Initiated");
65         try {
66             final  DataBroker dataBroker = session.getSALService(DataBroker.class);
67             idManager = new IdManager(dataBroker);
68             createIdPool();
69
70             interfaceManagerRpcService = new InterfaceManagerRpcService(dataBroker);
71             rpcRegistration = getRpcProviderRegistry().addRpcImplementation(
72                     OdlInterfaceRpcService.class, interfaceManagerRpcService);
73
74             interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager);
75             interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
76
77             interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker);
78             interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
79
80             topologyStateListener = new InterfaceTopologyStateListener(dataBroker);
81             topologyStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
82
83             flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(dataBroker);
84             flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
85
86             flowBasedServicesInterfaceStateListener =
87                     new FlowBasedServicesInterfaceStateListener(dataBroker);
88             flowBasedServicesInterfaceStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
89
90             vlanMemberConfigListener =
91                                new VlanMemberConfigListener(dataBroker, idManager);
92             vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
93         } catch (Exception e) {
94             LOG.error("Error initializing services", e);
95         }
96     }
97
98     private void createIdPool() {
99         CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
100             .setPoolName(IfmConstants.IFM_IDPOOL_NAME)
101             .setIdStart(IfmConstants.IFM_IDPOOL_START)
102             .setPoolSize(new BigInteger(IfmConstants.IFM_IDPOOL_SIZE))
103             .build();
104         //TODO: Error handling
105         Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
106         try {
107             if ((result != null) && (result.get().isSuccessful())) {
108                 LOG.debug("Created IdPool for InterfaceMgr");
109             }
110         } catch (InterruptedException | ExecutionException e) {
111             LOG.error("Failed to create idPool for InterfaceMgr",e);
112         }
113     }
114
115     @Override
116     public void close() throws Exception {
117         LOG.info("InterfacemgrProvider Closed");
118         interfaceConfigListener.close();
119         rpcRegistration.close();
120     }
121
122     public RpcProviderRegistry getRpcProviderRegistry() {
123         return rpcProviderRegistry;
124     }
125
126     @Override
127     public Long getPortForInterface(String ifName) {
128         GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(ifName).build();
129         Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
130         try {
131             RpcResult<GetPortFromInterfaceOutput> port = output.get();
132             if(port.isSuccessful()){
133                 return port.getResult().getPortno();
134             }
135         }catch(NullPointerException | InterruptedException | ExecutionException e){
136             LOG.warn("Exception when getting port for interface",e);
137         }
138         return null;
139     }
140
141     @Override
142     public Long getPortForInterface(Interface intf) {
143         GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(intf.getName()).build();
144         Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
145         try {
146             RpcResult<GetPortFromInterfaceOutput> port = output.get();
147             if(port.isSuccessful()){
148                 return port.getResult().getPortno();
149             }
150         }catch(NullPointerException | InterruptedException | ExecutionException e){
151             LOG.warn("Exception when getting port for interface",e);
152         }
153         return null;
154     }
155
156     @Override
157     public BigInteger getDpnForInterface(String ifName) {
158         GetDpidFromInterfaceInput input = new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
159         Future<RpcResult<GetDpidFromInterfaceOutput>> output = interfaceManagerRpcService.getDpidFromInterface(input);
160         try {
161             RpcResult<GetDpidFromInterfaceOutput> dpn = output.get();
162             if(dpn.isSuccessful()){
163                 return dpn.getResult().getDpid();
164             }
165         }catch(NullPointerException | InterruptedException | ExecutionException e){
166             LOG.warn("Exception when getting port for interface",e);
167         }
168         return null;
169     }
170
171     @Override
172     public String getEndpointIpForDpn(BigInteger dpnId) {
173         GetEndpointIpForDpnInput input = new GetEndpointIpForDpnInputBuilder().setDpid(dpnId).build();
174         Future<RpcResult<GetEndpointIpForDpnOutput>> output = interfaceManagerRpcService.getEndpointIpForDpn(input);
175         try {
176             RpcResult<GetEndpointIpForDpnOutput> ipForDpnOutputRpcResult = output.get();
177             if(ipForDpnOutputRpcResult.isSuccessful()){
178                 List<IpAddress> localIps = ipForDpnOutputRpcResult.getResult().getLocalIps();
179                 if(!localIps.isEmpty()) {
180                     return localIps.get(0).getIpv4Address().getValue();
181                 }
182             }
183         }catch(NullPointerException | InterruptedException | ExecutionException e){
184             LOG.warn("Exception when getting port for interface",e);
185         }
186         return null;
187     }
188
189     @Override
190     public List<ActionInfo> getInterfaceEgressActions(String ifName) {
191         return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName);
192     }
193
194     @Override
195     public BigInteger getDpnForInterface(Interface intrf) {
196         return getDpnForInterface(intrf.getName());
197     }
198 }