2 * Copyright (c) 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.genius.interfacemanager;
11 import com.google.common.base.Optional;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.concurrent.ExecutionException;
16 import java.util.concurrent.Future;
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
19 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
22 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
23 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
24 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
25 import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
26 import org.opendaylight.genius.interfacemanager.exceptions.InterfaceAlreadyExistsException;
27 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
28 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo.InterfaceAdminState;
29 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
30 import org.opendaylight.genius.interfacemanager.listeners.AlivenessMonitorListener;
31 import org.opendaylight.genius.interfacemanager.listeners.CacheInterfaceConfigListener;
32 import org.opendaylight.genius.interfacemanager.listeners.CacheInterfaceStateListener;
33 import org.opendaylight.genius.interfacemanager.listeners.HwVTEPConfigListener;
34 import org.opendaylight.genius.interfacemanager.listeners.HwVTEPTunnelsStateListener;
35 import org.opendaylight.genius.interfacemanager.listeners.InterfaceConfigListener;
36 import org.opendaylight.genius.interfacemanager.listeners.InterfaceInventoryStateListener;
37 import org.opendaylight.genius.interfacemanager.listeners.InterfaceTopologyStateListener;
38 import org.opendaylight.genius.interfacemanager.listeners.TerminationPointStateListener;
39 import org.opendaylight.genius.interfacemanager.listeners.VlanMemberConfigListener;
40 import org.opendaylight.genius.interfacemanager.pmcounters.NodeConnectorStatsImpl;
41 import org.opendaylight.genius.interfacemanager.rpcservice.InterfaceManagerRpcService;
42 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.listeners.FlowBasedServicesConfigListener;
43 import org.opendaylight.genius.interfacemanager.servicebindings.flowbased.listeners.FlowBasedServicesInterfaceStateListener;
44 import org.opendaylight.genius.interfacemanager.statusanddiag.InterfaceStatusMonitor;
45 import org.opendaylight.genius.mdsalutil.ActionInfo;
46 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
52 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
53 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus;
54 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInput;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInputBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceOutput;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEndpointIpForDpnInput;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEndpointIpForDpnInputBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEndpointIpForDpnOutput;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetPortFromInterfaceInput;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetPortFromInterfaceInputBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetPortFromInterfaceOutput;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceBindings;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.ServiceModeIngress;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfo;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.ServicesInfoKey;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesKey;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService;
83 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
84 import org.opendaylight.yangtools.yang.common.RpcResult;
85 import org.slf4j.Logger;
86 import org.slf4j.LoggerFactory;
89 public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable, IInterfaceManager {
91 private static final Logger LOG = LoggerFactory.getLogger(InterfacemgrProvider.class);
92 private static final InterfaceStatusMonitor interfaceStatusMonitor = InterfaceStatusMonitor.getInstance();
94 private RpcProviderRegistry rpcProviderRegistry;
95 private IdManagerService idManager;
96 private NotificationService notificationService;
97 private AlivenessMonitorService alivenessManager;
98 private IMdsalApiManager mdsalManager;
99 private InterfaceConfigListener interfaceConfigListener;
100 private InterfaceTopologyStateListener topologyStateListener;
101 private TerminationPointStateListener terminationPointStateListener;
102 private HwVTEPTunnelsStateListener hwVTEPTunnelsStateListener;
103 private InterfaceInventoryStateListener interfaceInventoryStateListener;
104 private FlowBasedServicesInterfaceStateListener flowBasedServicesInterfaceStateListener;
105 private FlowBasedServicesConfigListener flowBasedServicesConfigListener;
106 private VlanMemberConfigListener vlanMemberConfigListener;
107 private HwVTEPConfigListener hwVTEPConfigListener;
108 private AlivenessMonitorListener alivenessMonitorListener;
109 private DataBroker dataBroker;
110 private InterfaceManagerRpcService interfaceManagerRpcService;
111 private BindingAwareBroker.RpcRegistration<OdlInterfaceRpcService> rpcRegistration;
112 private NodeConnectorStatsImpl nodeConnectorStatsManager;
113 private CacheInterfaceConfigListener cacheInterfaceConfigListener;
114 private CacheInterfaceStateListener cacheInterfaceStateListener;
116 public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
117 this.rpcProviderRegistry = rpcProviderRegistry;
118 interfaceStatusMonitor.registerMbean();
121 public void setMdsalManager(IMdsalApiManager mdsalManager) {
122 this.mdsalManager = mdsalManager;
125 public void setNotificationService(NotificationService notificationService) {
126 this.notificationService = notificationService;
129 public DataBroker getDataBroker(){
130 return this.dataBroker;
134 public void onSessionInitiated(ProviderContext session) {
135 LOG.info("InterfacemgrProvider Session Initiated");
136 interfaceStatusMonitor.reportStatus("STARTING");
138 dataBroker = session.getSALService(DataBroker.class);
139 idManager = rpcProviderRegistry.getRpcService(IdManagerService.class);
142 alivenessManager = rpcProviderRegistry.getRpcService(AlivenessMonitorService.class);
143 interfaceManagerRpcService = new InterfaceManagerRpcService(dataBroker, mdsalManager);
144 rpcRegistration = getRpcProviderRegistry().addRpcImplementation(
145 OdlInterfaceRpcService.class, interfaceManagerRpcService);
147 interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager, alivenessManager, mdsalManager);
148 interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
150 interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker, idManager, mdsalManager, alivenessManager);
151 interfaceInventoryStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
153 topologyStateListener = new InterfaceTopologyStateListener(dataBroker);
154 topologyStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
156 hwVTEPTunnelsStateListener = new HwVTEPTunnelsStateListener(dataBroker);
157 hwVTEPTunnelsStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
159 terminationPointStateListener = new TerminationPointStateListener(dataBroker);
160 terminationPointStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
162 flowBasedServicesConfigListener = new FlowBasedServicesConfigListener(this);
163 flowBasedServicesConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
165 flowBasedServicesInterfaceStateListener =
166 new FlowBasedServicesInterfaceStateListener(dataBroker);
167 flowBasedServicesInterfaceStateListener.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
169 vlanMemberConfigListener =
170 new VlanMemberConfigListener(dataBroker, idManager, alivenessManager, mdsalManager);
171 vlanMemberConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
173 hwVTEPConfigListener = new HwVTEPConfigListener(dataBroker);
174 hwVTEPConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
176 alivenessMonitorListener = new org.opendaylight.genius.interfacemanager.listeners.AlivenessMonitorListener(dataBroker);
177 notificationService.registerNotificationListener(alivenessMonitorListener);
179 cacheInterfaceConfigListener = new CacheInterfaceConfigListener(dataBroker);
181 cacheInterfaceStateListener = new CacheInterfaceStateListener(dataBroker);
183 //Initialize nodeconnectorstatsimpl
184 nodeConnectorStatsManager = new NodeConnectorStatsImpl(dataBroker, notificationService,
185 session.getRpcService(OpendaylightPortStatisticsService.class), session.getRpcService(OpendaylightFlowTableStatisticsService.class));
188 interfaceStatusMonitor.reportStatus("OPERATIONAL");
189 } catch (Exception e) {
190 LOG.error("Error initializing services", e);
191 interfaceStatusMonitor.reportStatus("ERROR");
195 private void createIdPool() {
196 CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
197 .setPoolName(IfmConstants.IFM_IDPOOL_NAME)
198 .setLow(IfmConstants.IFM_ID_POOL_START)
199 .setHigh(IfmConstants.IFM_ID_POOL_END)
201 //TODO: Error handling
202 Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
204 if ((result != null) && (result.get().isSuccessful())) {
205 LOG.debug("Created IdPool for InterfaceMgr");
207 } catch (InterruptedException | ExecutionException e) {
208 LOG.error("Failed to create idPool for InterfaceMgr", e);
213 public void close() throws Exception {
214 LOG.info("InterfacemgrProvider Closed");
215 interfaceConfigListener.close();
216 rpcRegistration.close();
217 cacheInterfaceConfigListener.close();
218 cacheInterfaceStateListener.close();
221 public RpcProviderRegistry getRpcProviderRegistry() {
222 return rpcProviderRegistry;
226 public Long getPortForInterface(String ifName) {
227 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(ifName).build();
228 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
230 RpcResult<GetPortFromInterfaceOutput> port = output.get();
231 if (port.isSuccessful()) {
232 return port.getResult().getPortno();
234 } catch (NullPointerException | InterruptedException | ExecutionException e) {
235 LOG.warn("Exception when getting port for interface", e);
241 public Long getPortForInterface(Interface intf) {
242 GetPortFromInterfaceInput input = new GetPortFromInterfaceInputBuilder().setIntfName(intf.getName()).build();
243 Future<RpcResult<GetPortFromInterfaceOutput>> output = interfaceManagerRpcService.getPortFromInterface(input);
245 RpcResult<GetPortFromInterfaceOutput> port = output.get();
246 if (port.isSuccessful()) {
247 return port.getResult().getPortno();
249 } catch (NullPointerException | InterruptedException | ExecutionException e) {
250 LOG.warn("Exception when getting port for interface", e);
256 public InterfaceInfo getInterfaceInfo(String interfaceName) {
258 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface
259 ifState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceName, dataBroker);
261 if (ifState == null) {
262 LOG.error("Interface {} is not present", interfaceName);
266 Integer lportTag = ifState.getIfIndex();
267 Interface intf = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker);
269 LOG.error("Interface {} doesn't exist in config datastore", interfaceName);
273 NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(intf.getName(), dataBroker);
274 InterfaceInfo.InterfaceType interfaceType = IfmUtil.getInterfaceType(intf);
275 InterfaceInfo interfaceInfo = new InterfaceInfo(interfaceName);
276 BigInteger dpId = org.opendaylight.genius.interfacemanager.globals.IfmConstants.INVALID_DPID;
277 Integer portNo = org.opendaylight.genius.interfacemanager.globals.IfmConstants.INVALID_PORT_NO;
279 dpId = new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId));
280 portNo = Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId));
282 if (interfaceType == InterfaceInfo.InterfaceType.VLAN_INTERFACE) {
283 interfaceInfo = IfmUtil.getVlanInterfaceInfo(interfaceName, intf, dpId);
284 } else if (interfaceType == InterfaceInfo.InterfaceType.VXLAN_TRUNK_INTERFACE ||
285 interfaceType == InterfaceInfo.InterfaceType.GRE_TRUNK_INTERFACE) {
286 // TODO : since there is no logical grouping for tunnel interfaces, there is no need
287 // for this code as of now. will be revisited once the support comes
290 LOG.error("Type of Interface {} is unknown", interfaceName);
293 interfaceInfo.setDpId(dpId);
294 interfaceInfo.setPortNo(portNo);
295 interfaceInfo.setAdminState((intf.isEnabled() == true) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED);
296 interfaceInfo.setInterfaceName(interfaceName);
297 interfaceInfo.setInterfaceTag(lportTag);
298 interfaceInfo.setInterfaceType(interfaceType);
299 interfaceInfo.setGroupId(IfmUtil.getGroupId(lportTag, interfaceType));
300 interfaceInfo.setOpState((ifState.getOperStatus() == OperStatus.Up) ? InterfaceInfo.InterfaceOpState.UP : InterfaceInfo.InterfaceOpState.DOWN);
303 return interfaceInfo;
308 public InterfaceInfo getInterfaceInfoFromOperationalDataStore(String interfaceName, InterfaceInfo.InterfaceType interfaceType) {
309 InterfaceInfo interfaceInfo = new InterfaceInfo(interfaceName);
310 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = InterfaceManagerCommonUtils
311 .getInterfaceStateFromOperDS(interfaceName, dataBroker);
312 if (ifState == null) {
313 LOG.error("Interface {} is not present", interfaceName);
316 Integer lportTag = ifState.getIfIndex();
317 NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
319 interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId)));
320 interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId)));
322 interfaceInfo.setAdminState((ifState.getAdminStatus() == AdminStatus.Up) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED);
323 interfaceInfo.setInterfaceName(interfaceName);
324 interfaceInfo.setInterfaceTag(lportTag);
325 interfaceInfo.setInterfaceType(interfaceType);
326 interfaceInfo.setGroupId(IfmUtil.getGroupId(lportTag, interfaceType));
327 interfaceInfo.setOpState((ifState.getOperStatus() == OperStatus.Up) ? InterfaceInfo.InterfaceOpState.UP : InterfaceInfo.InterfaceOpState.DOWN);
330 return interfaceInfo;
334 public InterfaceInfo getInterfaceInfoFromOperationalDataStore(String interfaceName) {
335 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = InterfaceManagerCommonUtils
336 .getInterfaceStateFromOperDS(interfaceName, dataBroker);
337 if (ifState == null) {
338 LOG.error("Interface {} is not present", interfaceName);
341 Integer lportTag = ifState.getIfIndex();
342 InterfaceInfo interfaceInfo = new InterfaceInfo(interfaceName);
343 NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
345 interfaceInfo.setPortName(IfmUtil.getPortName(dataBroker, ncId));
346 interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId)));
347 interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId)));
349 interfaceInfo.setAdminState((ifState.getAdminStatus() == AdminStatus.Up) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED);
350 interfaceInfo.setInterfaceName(interfaceName);
351 interfaceInfo.setInterfaceTag(lportTag);
352 interfaceInfo.setOpState((ifState.getOperStatus() == OperStatus.Down) ? InterfaceInfo.InterfaceOpState.DOWN :
353 ifState.getOperStatus() == OperStatus.Unknown ? InterfaceInfo.InterfaceOpState.UNKNOWN : InterfaceInfo.InterfaceOpState.UP);
354 return interfaceInfo;
358 public Interface getInterfaceInfoFromConfigDataStore(String interfaceName) {
359 Interface intf = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker);
364 public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId,
365 String description, IfL2vlan.L2vlanMode l2vlanMode) throws InterfaceAlreadyExistsException {
367 LOG.info("Create VLAN interface : {}", interfaceName);
368 InstanceIdentifier<Interface> interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(interfaceName));
369 Interface interfaceOptional = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker);
370 if (interfaceOptional != null) {
371 LOG.debug("VLAN interface is already exist", interfaceOptional.getDescription());
372 throw new InterfaceAlreadyExistsException(interfaceOptional.getName());
374 IfL2vlanBuilder l2vlanBuilder = new IfL2vlanBuilder().setL2vlanMode(l2vlanMode);
376 l2vlanBuilder.setVlanId(new VlanId(vlanId));
378 ParentRefs parentRefs = new ParentRefsBuilder().setParentInterface(portName).build();
379 Interface inf = new InterfaceBuilder().setEnabled(true).setName(interfaceName).setType(L2vlan.class).
380 addAugmentation(IfL2vlan.class, l2vlanBuilder.build()).addAugmentation(ParentRefs.class, parentRefs).
381 setDescription(description).build();
382 WriteTransaction t = dataBroker.newWriteOnlyTransaction();
383 t.put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier, inf, true);
387 public void bindService(String interfaceName, BoundServices serviceInfo) {
388 LOG.info("Binding Service : {}", interfaceName);
389 WriteTransaction t = dataBroker.newWriteOnlyTransaction();
390 InstanceIdentifier<BoundServices> boundServicesInstanceIdentifier = InstanceIdentifier.builder(ServiceBindings.class)
391 .child(ServicesInfo.class, new ServicesInfoKey(interfaceName, ServiceModeIngress.class))
392 .child(BoundServices.class, new BoundServicesKey(serviceInfo.getServicePriority())).build();
393 t.put(LogicalDatastoreType.CONFIGURATION, boundServicesInstanceIdentifier, serviceInfo, true);
398 public void unbindService(String interfaceName, BoundServices serviceInfo) {
399 LOG.info("Unbinding Service : {}", interfaceName);
400 WriteTransaction t = dataBroker.newWriteOnlyTransaction();
401 InstanceIdentifier<BoundServices> boundServicesInstanceIdentifier = InstanceIdentifier.builder(ServiceBindings.class)
402 .child(ServicesInfo.class, new ServicesInfoKey(interfaceName, ServiceModeIngress.class))
403 .child(BoundServices.class, new BoundServicesKey(serviceInfo.getServicePriority())).build();
404 t.delete(LogicalDatastoreType.CONFIGURATION, boundServicesInstanceIdentifier);
409 public BigInteger getDpnForInterface(String ifName) {
410 GetDpidFromInterfaceInput input = new GetDpidFromInterfaceInputBuilder().setIntfName(ifName).build();
411 Future<RpcResult<GetDpidFromInterfaceOutput>> output = interfaceManagerRpcService.getDpidFromInterface(input);
413 RpcResult<GetDpidFromInterfaceOutput> dpn = output.get();
414 if (dpn.isSuccessful()) {
415 return dpn.getResult().getDpid();
417 } catch (NullPointerException | InterruptedException | ExecutionException e) {
418 LOG.warn("Exception when getting port for interface", e);
424 public String getEndpointIpForDpn(BigInteger dpnId) {
425 GetEndpointIpForDpnInput input = new GetEndpointIpForDpnInputBuilder().setDpid(dpnId).build();
426 Future<RpcResult<GetEndpointIpForDpnOutput>> output = interfaceManagerRpcService.getEndpointIpForDpn(input);
428 RpcResult<GetEndpointIpForDpnOutput> ipForDpnOutputRpcResult = output.get();
429 if (ipForDpnOutputRpcResult.isSuccessful()) {
430 List<IpAddress> localIps = ipForDpnOutputRpcResult.getResult().getLocalIps();
431 if (!localIps.isEmpty()) {
432 return localIps.get(0).getIpv4Address().getValue();
435 } catch (NullPointerException | InterruptedException | ExecutionException e) {
436 LOG.warn("Exception when getting port for interface", e);
442 public List<ActionInfo> getInterfaceEgressActions(String ifName) {
443 return IfmUtil.getEgressActionInfosForInterface(ifName, 0, dataBroker);
447 public BigInteger getDpnForInterface(Interface intrf) {
448 return getDpnForInterface(intrf.getName());
452 public List<Interface> getVlanInterfaces() {
453 List<Interface> vlanList = new ArrayList<>();
454 InstanceIdentifier<Interfaces> interfacesInstanceIdentifier = InstanceIdentifier.builder(Interfaces.class).build();
455 Optional<Interfaces> interfacesOptional = IfmUtil.read(LogicalDatastoreType.CONFIGURATION, interfacesInstanceIdentifier, dataBroker);
456 if (!interfacesOptional.isPresent()) {
459 Interfaces interfaces = interfacesOptional.get();
460 List<Interface> interfacesList = interfaces.getInterface();
461 for (Interface iface : interfacesList) {
462 if (IfmUtil.getInterfaceType(iface) == InterfaceInfo.InterfaceType.VLAN_INTERFACE) {
470 public List<Interface> getVxlanInterfaces() {
471 return InterfaceManagerCommonUtils.getAllTunnelInterfaces(dataBroker,
472 InterfaceInfo.InterfaceType.VXLAN_TRUNK_INTERFACE);