1 package org.opendaylight.controller.sal.compatibility
3 import org.opendaylight.controller.sal.reader.IPluginInReadService
4 import org.opendaylight.controller.sal.core.NodeConnector
5 import org.opendaylight.controller.sal.core.Node
6 import org.opendaylight.controller.sal.flowprogrammer.Flow
7 import org.opendaylight.controller.sal.core.NodeTable
8 import org.opendaylight.controller.sal.binding.api.data.DataBrokerService
10 import static extension org.opendaylight.controller.sal.common.util.Arguments.*
11 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*
12 import static org.opendaylight.controller.sal.compatibility.MDFlowMapping.*
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService
18 import org.opendaylight.controller.sal.reader.NodeConnectorStatistics
19 import org.opendaylight.controller.sal.reader.FlowOnNode
20 import org.opendaylight.controller.sal.reader.NodeDescription
21 import org.slf4j.LoggerFactory
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsInputBuilder
23 import java.util.ArrayList
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllNodeConnectorStatisticsInputBuilder
25 import org.opendaylight.controller.sal.inventory.IPluginInInventoryService
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
27 import org.opendaylight.controller.sal.inventory.IPluginOutInventoryService
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
30 import java.util.Collections
31 import org.opendaylight.controller.sal.core.UpdateType
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
35 import org.opendaylight.yangtools.yang.binding.DataObject
36 import org.opendaylight.controller.sal.topology.IPluginOutTopologyService
37 import org.opendaylight.controller.sal.topology.IPluginInTopologyService
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryService
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener
40 import org.opendaylight.controller.sal.core.Edge
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.Link
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkOverutilized
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemoved
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkUtilizationNormal
46 import org.opendaylight.controller.sal.topology.TopoEdgeUpdate
47 import org.opendaylight.controller.sal.discovery.IDiscoveryService
49 class InventoryAndReadAdapter implements IPluginInTopologyService, IPluginInReadService, IPluginInInventoryService, OpendaylightInventoryListener, FlowTopologyDiscoveryListener {
51 private static val LOG = LoggerFactory.getLogger(InventoryAndReadAdapter);
54 DataBrokerService dataService;
57 OpendaylightFlowStatisticsService flowStatisticsService;
60 IPluginOutInventoryService inventoryPublisher;
63 IPluginOutTopologyService topologyPublisher;
66 IDiscoveryService discoveryPublisher;
69 FlowTopologyDiscoveryService topologyDiscovery;
71 override getTransmitRate(NodeConnector connector) {
72 val nodeConnector = readFlowCapableNodeConnector(connector.toNodeConnectorRef);
73 return nodeConnector.currentSpeed
76 override readAllFlow(Node node, boolean cached) {
77 val input = new GetAllFlowStatisticsInputBuilder;
78 input.setNode(node.toNodeRef);
79 val result = flowStatisticsService.getAllFlowStatistics(input.build)
81 val statistics = result.get.result;
82 val output = new ArrayList<FlowOnNode>();
83 for (stat : statistics.flowStatistics) {
84 // FIXME: Create FlowOnNode
89 override readAllNodeConnector(Node node, boolean cached) {
90 val input = new GetAllNodeConnectorStatisticsInputBuilder();
91 input.setNode(node.toNodeRef);
92 val result = flowStatisticsService.getAllNodeConnectorStatistics(input.build());
93 val statistics = result.get.result.nodeConnectorStatistics;
94 val ret = new ArrayList<NodeConnectorStatistics>();
95 for (stat : statistics) {
96 ret.add(stat.toNodeConnectorStatistics())
101 override readAllNodeTable(Node node, boolean cached) {
102 throw new UnsupportedOperationException("TODO: auto-generated method stub")
105 override readDescription(Node node, boolean cached) {
106 val capableNode = readFlowCapableNode(node.toNodeRef)
108 val it = new NodeDescription()
109 manufacturer = capableNode.manufacturer
110 serialNumber = capableNode.serialNumber
111 software = capableNode.software
112 description = capableNode.description
117 override readFlow(Node node, Flow flow, boolean cached) {
118 val input = flowStatisticsInput(node, flow);
119 val output = flowStatisticsService.getFlowStatistics(input);
122 val statistics = output.get().getResult();
123 if (statistics != null) {
124 val it = new FlowOnNode(flow);
125 byteCount = statistics.byteCount.value.longValue
126 durationNanoseconds = statistics.duration.getNanosecond().getValue().intValue();
127 durationSeconds = statistics.duration.getSecond().getValue().intValue();
128 packetCount = statistics.getPacketCount().getValue().longValue();
131 } catch (Exception e) {
132 LOG.error("Read flow not processed", e);
137 override readNodeConnector(NodeConnector connector, boolean cached) {
139 val getNodeConnectorStatisticsInput = FromSalConversionsUtils.nodeConnectorStatistics(connector);
140 val future = flowStatisticsService.getNodeConnectorStatistics(getNodeConnectorStatisticsInput);
142 val rpcResult = future.get();
143 val output = rpcResult.getResult();
145 if (output != null) {
146 return output.toNodeConnectorStatistics;
148 } catch (Exception e) {
149 LOG.error("Read node connector not processed", e);
155 override onNodeConnectorRemoved(NodeConnectorRemoved update) {
159 override onNodeRemoved(NodeRemoved notification) {
160 val properties = Collections.<org.opendaylight.controller.sal.core.Property>emptySet();
161 val org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> identifier = notification.nodeRef.value as org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>;
163 inventoryPublisher.updateNode(notification.nodeRef.toADNode, UpdateType.REMOVED, properties);
166 override onNodeConnectorUpdated(NodeConnectorUpdated update) {
167 val properties = new java.util.HashSet<org.opendaylight.controller.sal.core.Property>();
170 val org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> identifier = update.nodeConnectorRef.value as org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>;
171 var updateType = UpdateType.CHANGED;
172 if ( this._dataService.readOperationalData(identifier) == null ){
173 updateType = UpdateType.ADDED;
176 var nodeConnector = update.nodeConnectorRef.toADNodeConnector
179 properties.add(new org.opendaylight.controller.sal.core.Name(nodeConnector.ID.toString()));
181 inventoryPublisher.updateNodeConnector(nodeConnector , updateType , properties);
184 override onNodeUpdated(NodeUpdated notification) {
185 val properties = Collections.<org.opendaylight.controller.sal.core.Property>emptySet();
186 val org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject> identifier = notification.nodeRef.value as org.opendaylight.yangtools.yang.binding.InstanceIdentifier<? extends DataObject>;
188 var updateType = UpdateType.CHANGED;
189 if ( this._dataService.readOperationalData(identifier) == null ){
190 updateType = UpdateType.ADDED;
192 inventoryPublisher.updateNode(notification.nodeRef.toADNode, updateType, properties);
195 override getNodeProps() {
197 // FIXME: Read from MD-SAL inventory service
201 override getNodeConnectorProps(Boolean refresh) {
203 // FIXME: Read from MD-SAL Invcentory Service
207 override readNodeTable(NodeTable table, boolean cached) {
208 throw new UnsupportedOperationException("TODO: auto-generated method stub")
211 private def FlowCapableNode readFlowCapableNode(NodeRef ref) {
212 val dataObject = dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>);
213 val node = dataObject.checkInstanceOf(
214 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node);
215 return node.getAugmentation(FlowCapableNode);
218 private def FlowCapableNodeConnector readFlowCapableNodeConnector(NodeConnectorRef ref) {
219 val dataObject = dataService.readOperationalData(ref.value as InstanceIdentifier<? extends DataObject>);
220 val node = dataObject.checkInstanceOf(
221 org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector);
222 return node.getAugmentation(FlowCapableNodeConnector);
225 private static def toNodeConnectorStatistics(
226 org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.NodeConnectorStatistics output) {
227 val it = new NodeConnectorStatistics
229 collisionCount = output.getCollisionCount().longValue();
230 receiveCRCErrorCount = output.getReceiveCrcError().longValue();
231 receiveFrameErrorCount = output.getReceiveFrameError().longValue();
232 receiveOverRunErrorCount = output.getReceiveOverRunError().longValue();
234 receiveDropCount = output.getReceiveDrops().longValue();
235 receiveErrorCount = output.getReceiveErrors().longValue();
236 receivePacketCount = output.getPackets().getReceived().longValue();
237 receiveByteCount = output.getBytes().getReceived().longValue();
239 transmitDropCount = output.getTransmitDrops().longValue();
240 transmitErrorCount = output.getTransmitErrors().longValue();
241 transmitPacketCount = output.getPackets().getTransmitted().longValue();
242 transmitByteCount = output.getBytes().getTransmitted().longValue();
246 override sollicitRefresh() {
247 topologyDiscovery.solicitRefresh
250 override onLinkDiscovered(LinkDiscovered notification) {
251 val update = new TopoEdgeUpdate(notification.toADEdge,Collections.emptySet(),UpdateType.ADDED);
252 discoveryPublisher.notifyEdge(notification.toADEdge,UpdateType.ADDED,Collections.emptySet());
253 topologyPublisher.edgeUpdate(Collections.singletonList(update))
256 override onLinkOverutilized(LinkOverutilized notification) {
257 topologyPublisher.edgeOverUtilized(notification.toADEdge)
260 override onLinkRemoved(LinkRemoved notification) {
261 val update = new TopoEdgeUpdate(notification.toADEdge,Collections.emptySet(),UpdateType.REMOVED);
262 topologyPublisher.edgeUpdate(Collections.singletonList(update))
265 override onLinkUtilizationNormal(LinkUtilizationNormal notification) {
266 topologyPublisher.edgeUtilBackToNormal(notification.toADEdge)
270 def Edge toADEdge(Link link) {
271 new Edge(link.source.toADNodeConnector,link.destination.toADNodeConnector)