2 * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.vpnservice.interfacemgr;
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;
36 import java.math.BigInteger;
37 import java.util.List;
38 import java.util.concurrent.ExecutionException;
39 import java.util.concurrent.Future;
41 public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable, IInterfaceManager {
43 private static final Logger LOG = LoggerFactory.getLogger(InterfacemgrProvider.class);
45 private RpcProviderRegistry rpcProviderRegistry;
47 private InterfaceManager interfaceManager;
48 private IfmNodeConnectorListener ifmNcListener;
49 private IdManager idManager;
51 private InterfaceConfigListener interfaceConfigListener;
52 private InterfaceTopologyStateListener topologyStateListener;
53 private InterfaceInventoryStateListener interfaceInventoryStateListener;
54 private FlowBasedServicesInterfaceStateListener flowBasedServicesInterfaceStateListener;
55 private FlowBasedServicesConfigListener flowBasedServicesConfigListener;
56 private VlanMemberConfigListener vlanMemberConfigListener;
58 private InterfaceManagerRpcService interfaceManagerRpcService;
59 private BindingAwareBroker.RpcRegistration<OdlInterfaceRpcService> rpcRegistration;
61 public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
62 this.rpcProviderRegistry = rpcProviderRegistry;
66 public void onSessionInitiated(ProviderContext session) {
67 LOG.info("InterfacemgrProvider Session Initiated");
69 final DataBroker dataBroker = session.getSALService(DataBroker.class);
70 idManager = new IdManager(dataBroker);
73 interfaceManagerRpcService = new InterfaceManagerRpcService(dataBroker);
74 rpcRegistration = getRpcProviderRegistry().addRpcImplementation(
75 OdlInterfaceRpcService.class, interfaceManagerRpcService);
77 interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager);
78 interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
80 interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker);
81 interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
83 topologyStateListener = new InterfaceTopologyStateListener(dataBroker);
84 topologyStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
86 flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(dataBroker);
87 flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
89 flowBasedServicesInterfaceStateListener =
90 new FlowBasedServicesInterfaceStateListener(dataBroker);
91 flowBasedServicesInterfaceStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
93 vlanMemberConfigListener =
94 new VlanMemberConfigListener(dataBroker, idManager);
95 vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
98 /*interfaceManager = new InterfaceManager(dataBroker, idManager);
99 ifmNcListener = new IfmNodeConnectorListener(dataBroker, interfaceManager);*/
100 } catch (Exception e) {
101 LOG.error("Error initializing services", e);
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))
111 //TODO: Error handling
112 Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
114 if ((result != null) && (result.get().isSuccessful())) {
115 LOG.debug("Created IdPool for InterfaceMgr");
117 } catch (InterruptedException | ExecutionException e) {
118 LOG.error("Failed to create idPool for InterfaceMgr",e);
123 public void close() throws Exception {
124 LOG.info("InterfacemgrProvider Closed");
125 interfaceManager.close();
126 ifmNcListener.close();
127 interfaceConfigListener.close();
128 rpcRegistration.close();
131 public RpcProviderRegistry getRpcProviderRegistry() {
132 return rpcProviderRegistry;
136 public Long getPortForInterface(String ifName) {
137 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(ifName).build();
138 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
140 RpcResult<GetPortFromInterfaceOutput> port = output.get();
141 if(port.isSuccessful()){
142 return port.getResult().getPortno();
144 }catch(NullPointerException | InterruptedException | ExecutionException e){
145 LOG.warn("Exception when getting port for interface",e);
151 public Long getPortForInterface(Interface intf) {
152 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(intf.getName()).build();
153 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
155 RpcResult<GetPortFromInterfaceOutput> port = output.get();
156 if(port.isSuccessful()){
157 return port.getResult().getPortno();
159 }catch(NullPointerException | InterruptedException | ExecutionException e){
160 LOG.warn("Exception when getting port for interface",e);
166 public BigInteger getDpnForInterface(String ifName) {
167 GetDpidFromInterfaceInput input = new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
168 Future<RpcResult<GetDpidFromInterfaceOutput>> output = interfaceManagerRpcService.getDpidFromInterface(input);
170 RpcResult<GetDpidFromInterfaceOutput> dpn = output.get();
171 if(dpn.isSuccessful()){
172 return dpn.getResult().getDpid();
174 }catch(NullPointerException | InterruptedException | ExecutionException e){
175 LOG.warn("Exception when getting port for interface",e);
181 public String getEndpointIpForDpn(BigInteger dpnId) {
182 GetEndpointIpForDpnInput input = new GetEndpointIpForDpnInputBuilder().setDpid(dpnId).build();
183 Future<RpcResult<GetEndpointIpForDpnOutput>> output = interfaceManagerRpcService.getEndpointIpForDpn(input);
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();
192 }catch(NullPointerException | InterruptedException | ExecutionException e){
193 LOG.warn("Exception when getting port for interface",e);
199 public List<MatchInfo> getInterfaceIngressRule(String ifName) {
200 return interfaceManager.getInterfaceIngressRule(ifName);
204 public List<ActionInfo> getInterfaceEgressActions(String ifName) {
205 return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName);
209 public BigInteger getDpnForInterface(Interface intrf) {
210 return getDpnForInterface(intrf.getName());