2 * Copyright (c) 2015 - 2016 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 java.math.BigInteger;
11 import java.util.List;
12 import java.util.concurrent.ExecutionException;
13 import java.util.concurrent.Future;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
17 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
20 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
21 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
22 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
23 import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils;
24 import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo;
25 import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo.InterfaceAdminState;
26 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
27 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceConfigListener;
28 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceInventoryStateListener;
29 import org.opendaylight.vpnservice.interfacemgr.listeners.InterfaceTopologyStateListener;
30 import org.opendaylight.vpnservice.interfacemgr.listeners.VlanMemberConfigListener;
31 import org.opendaylight.vpnservice.interfacemgr.rpcservice.InterfaceManagerRpcService;
32 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.listeners.FlowBasedServicesConfigListener;
33 import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.listeners.FlowBasedServicesInterfaceStateListener;
34 import org.opendaylight.vpnservice.mdsalutil.ActionInfo;
35 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorListener;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceInputBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetDpidFromInterfaceOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEndpointIpForDpnInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEndpointIpForDpnInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEndpointIpForDpnOutput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetPortFromInterfaceInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetPortFromInterfaceInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetPortFromInterfaceOutput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService;
56 import org.opendaylight.yangtools.yang.common.RpcResult;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
60 public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable, IInterfaceManager {
62 private static final Logger LOG = LoggerFactory.getLogger(InterfacemgrProvider.class);
64 private RpcProviderRegistry rpcProviderRegistry;
65 private IdManagerService idManager;
66 private NotificationService notificationService;
67 private AlivenessMonitorService alivenessManager;
68 private IMdsalApiManager mdsalManager;
69 private InterfaceConfigListener interfaceConfigListener;
70 private InterfaceTopologyStateListener topologyStateListener;
71 private InterfaceInventoryStateListener interfaceInventoryStateListener;
72 private FlowBasedServicesInterfaceStateListener flowBasedServicesInterfaceStateListener;
73 private FlowBasedServicesConfigListener flowBasedServicesConfigListener;
74 private VlanMemberConfigListener vlanMemberConfigListener;
75 private org.opendaylight.vpnservice.interfacemgr.listeners.AlivenessMonitorListener alivenessMonitorListener;
76 private DataBroker dataBroker;
77 private InterfaceManagerRpcService interfaceManagerRpcService;
78 private BindingAwareBroker.RpcRegistration<OdlInterfaceRpcService> rpcRegistration;
80 public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
81 this.rpcProviderRegistry = rpcProviderRegistry;
84 public void setMdsalManager(IMdsalApiManager mdsalManager) {
85 this.mdsalManager = mdsalManager;
88 public void setNotificationService(NotificationService notificationService) {
89 this.notificationService = notificationService;
93 public void onSessionInitiated(ProviderContext session) {
94 LOG.info("InterfacemgrProvider Session Initiated");
96 dataBroker = session.getSALService(DataBroker.class);
97 idManager = rpcProviderRegistry.getRpcService(IdManagerService.class);
100 alivenessManager = rpcProviderRegistry.getRpcService(AlivenessMonitorService.class);
101 interfaceManagerRpcService = new InterfaceManagerRpcService(dataBroker, mdsalManager);
102 rpcRegistration = getRpcProviderRegistry().addRpcImplementation(
103 OdlInterfaceRpcService.class, interfaceManagerRpcService);
105 interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager,alivenessManager, mdsalManager);
106 interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
108 interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker, idManager, mdsalManager, alivenessManager);
109 interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
111 topologyStateListener = new InterfaceTopologyStateListener(dataBroker);
112 topologyStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
114 flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(dataBroker);
115 flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
117 flowBasedServicesInterfaceStateListener =
118 new FlowBasedServicesInterfaceStateListener(dataBroker);
119 flowBasedServicesInterfaceStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
121 vlanMemberConfigListener =
122 new VlanMemberConfigListener(dataBroker, idManager, alivenessManager,mdsalManager);
123 vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
124 alivenessMonitorListener = new org.opendaylight.vpnservice.interfacemgr.listeners.AlivenessMonitorListener(dataBroker);
125 notificationService.registerNotificationListener(alivenessMonitorListener);
126 } catch (Exception e) {
127 LOG.error("Error initializing services", e);
131 private void createIdPool() {
132 CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
133 .setPoolName(IfmConstants.IFM_IDPOOL_NAME)
134 .setLow(IfmConstants.IFM_ID_POOL_START)
135 .setHigh(IfmConstants.IFM_ID_POOL_END)
137 //TODO: Error handling
138 Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
140 if ((result != null) && (result.get().isSuccessful())) {
141 LOG.debug("Created IdPool for InterfaceMgr");
143 } catch (InterruptedException | ExecutionException e) {
144 LOG.error("Failed to create idPool for InterfaceMgr",e);
149 public void close() throws Exception {
150 LOG.info("InterfacemgrProvider Closed");
151 interfaceConfigListener.close();
152 rpcRegistration.close();
155 public RpcProviderRegistry getRpcProviderRegistry() {
156 return rpcProviderRegistry;
160 public Long getPortForInterface(String ifName) {
161 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(ifName).build();
162 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
164 RpcResult<GetPortFromInterfaceOutput> port = output.get();
165 if(port.isSuccessful()){
166 return port.getResult().getPortno();
168 }catch(NullPointerException | InterruptedException | ExecutionException e){
169 LOG.warn("Exception when getting port for interface",e);
175 public Long getPortForInterface(Interface intf) {
176 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(intf.getName()).build();
177 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
179 RpcResult<GetPortFromInterfaceOutput> port = output.get();
180 if(port.isSuccessful()){
181 return port.getResult().getPortno();
183 }catch(NullPointerException | InterruptedException | ExecutionException e){
184 LOG.warn("Exception when getting port for interface",e);
190 public InterfaceInfo getInterfaceInfo(String interfaceName) {
191 //FIXME [ELANBE] This is not working yet, fix this
193 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
194 ifState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceName,dataBroker);
197 LOG.error("Interface {} is not present", interfaceName);
201 Integer lportTag = ifState.getIfIndex();
202 Interface intf = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker);
204 NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(intf, dataBroker);
205 InterfaceInfo.InterfaceType interfaceType = IfmUtil.getInterfaceType(intf);
206 InterfaceInfo interfaceInfo = null;
207 BigInteger dpId = org.opendaylight.vpnservice.interfacemgr.globals.IfmConstants.INVALID_DPID;
208 Integer portNo = org.opendaylight.vpnservice.interfacemgr.globals.IfmConstants.INVALID_PORT_NO;
210 dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId));
211 portNo = Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId));
214 if(interfaceType == InterfaceInfo.InterfaceType.VLAN_INTERFACE){
215 interfaceInfo = IfmUtil.getVlanInterfaceInfo(interfaceName, intf, dpId);
216 } else if (interfaceType == InterfaceInfo.InterfaceType.VXLAN_TRUNK_INTERFACE || interfaceType == InterfaceInfo.InterfaceType.GRE_TRUNK_INTERFACE) {/*
217 trunkInterfaceInfo trunkInterfaceInfo = (TrunkInterfaceInfo) ConfigIfmUtil.getTrunkInterfaceInfo(ifName, ConfigIfmUtil.getInterfaceByIfName(dataBroker, ifName));
218 String higherLayerIf = inf.getHigherLayerIf().get(0);
219 Interface vlanInterface = ConfigIfmUtil.getInterfaceByIfName(dataBroker, higherLayerIf);
220 trunkInterfaceInfo.setPortName(vlanInterface.getAugmentation(BaseConfig.class).getParentInterface());
221 trunkInterfaceManager.updateTargetMacAddressInInterfaceInfo(trunkInterfaceInfo, trunkInterface);
222 if (trunkInterface.getPhysAddress() != null) {
223 trunkInterfaceInfo.setLocalMacAddress(trunkInterface.getPhysAddress().getValue());
225 interfaceInfo = trunkInterfaceInfo;
226 interfaceInfo.setL2domainGroupId(IfmUtil.getGroupId(OperationalIfmUtil.getInterfaceStateByIfName(dataBroker, higherLayerIf).getIfIndex(), InterfaceType.VLAN_INTERFACE));
228 LOG.error("Type of Interface {} is unknown", interfaceName);
231 interfaceInfo.setDpId(dpId);
232 interfaceInfo.setPortNo(portNo);
233 interfaceInfo.setAdminState((intf.isEnabled() == true) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED);
234 interfaceInfo.setInterfaceName(interfaceName);
235 interfaceInfo.setInterfaceTag(lportTag);
236 interfaceInfo.setInterfaceType(interfaceType);
237 interfaceInfo.setGroupId(IfmUtil.getGroupId(lportTag, interfaceType));
238 interfaceInfo.setOpState((ifState.getOperStatus() == OperStatus.Up) ? InterfaceInfo.InterfaceOpState.UP : InterfaceInfo.InterfaceOpState.DOWN);
241 return interfaceInfo;
246 public InterfaceInfo getInterfaceInfoFromOperationalDataStore(String interfaceName, InterfaceInfo.InterfaceType interfaceType) {
247 InterfaceInfo interfaceInfo = new InterfaceInfo(interfaceName);
248 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = InterfaceManagerCommonUtils
249 .getInterfaceStateFromOperDS(interfaceName, dataBroker);
250 if (ifState == null) {
251 LOG.error("Interface {} is not present", interfaceName);
254 Integer lportTag = ifState.getIfIndex();
255 Interface intf = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker);
256 NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(intf, dataBroker);
258 interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId)));
259 interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId)));
261 interfaceInfo.setAdminState((intf.isEnabled() == true) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED);
262 interfaceInfo.setInterfaceName(interfaceName);
263 interfaceInfo.setInterfaceTag(lportTag);
264 interfaceInfo.setInterfaceType(interfaceType);
265 interfaceInfo.setGroupId(IfmUtil.getGroupId(lportTag, interfaceType));
266 interfaceInfo.setOpState((ifState.getOperStatus() == OperStatus.Up) ? InterfaceInfo.InterfaceOpState.UP : InterfaceInfo.InterfaceOpState.DOWN);
269 return interfaceInfo;
273 public BigInteger getDpnForInterface(String ifName) {
274 GetDpidFromInterfaceInput input = new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
275 Future<RpcResult<GetDpidFromInterfaceOutput>> output = interfaceManagerRpcService.getDpidFromInterface(input);
277 RpcResult<GetDpidFromInterfaceOutput> dpn = output.get();
278 if(dpn.isSuccessful()){
279 return dpn.getResult().getDpid();
281 }catch(NullPointerException | InterruptedException | ExecutionException e){
282 LOG.warn("Exception when getting port for interface",e);
288 public String getEndpointIpForDpn(BigInteger dpnId) {
289 GetEndpointIpForDpnInput input = new GetEndpointIpForDpnInputBuilder().setDpid(dpnId).build();
290 Future<RpcResult<GetEndpointIpForDpnOutput>> output = interfaceManagerRpcService.getEndpointIpForDpn(input);
292 RpcResult<GetEndpointIpForDpnOutput> ipForDpnOutputRpcResult = output.get();
293 if(ipForDpnOutputRpcResult.isSuccessful()){
294 List<IpAddress> localIps = ipForDpnOutputRpcResult.getResult().getLocalIps();
295 if(!localIps.isEmpty()) {
296 return localIps.get(0).getIpv4Address().getValue();
299 }catch(NullPointerException | InterruptedException | ExecutionException e){
300 LOG.warn("Exception when getting port for interface",e);
306 public List<ActionInfo> getInterfaceEgressActions(String ifName) {
307 return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName);
311 public BigInteger getDpnForInterface(Interface intrf) {
312 return getDpnForInterface(intrf.getName());