X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fstatistics%2FStatisticsGatheringUtils.java;h=b3952c61af59fc96822ab27a9ff20b19e1bc3bdb;hb=1765d780fc9ca286e86741acbb5c26668c2419d8;hp=050a0012e640feffe462c5a8fe47b1912b53943d;hpb=6c52fa23e21997ac76636b65ec492156b0832360;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsGatheringUtils.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsGatheringUtils.java index 050a0012e6..b3952c61af 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsGatheringUtils.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsGatheringUtils.java @@ -24,8 +24,10 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.registry.flow.FlowRegistryKey; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.EventIdentifier; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.StatisticsGatherer; import org.opendaylight.openflowplugin.impl.registry.flow.FlowRegistryKeyFactory; -import org.opendaylight.openflowplugin.impl.statistics.services.dedicated.StatisticsGatheringService; +import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.EventsTimeCounter; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; @@ -38,8 +40,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowStatisticsData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowStatisticsDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdate; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.statistics.FlowStatisticsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsData; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdate; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap; @@ -59,12 +64,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdated; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterStatistics; @@ -101,66 +103,74 @@ public final class StatisticsGatheringUtils { private static final Logger LOG = LoggerFactory.getLogger(StatisticsGatheringUtils.class); private static final SinglePurposeMultipartReplyTranslator MULTIPART_REPLY_TRANSLATOR = new SinglePurposeMultipartReplyTranslator(); + public static final String QUEUE2_REQCTX = "QUEUE2REQCTX-"; private StatisticsGatheringUtils() { throw new IllegalStateException("This class should not be instantiated."); } - - public static ListenableFuture gatherStatistics(final StatisticsGatheringService statisticsGatheringService, + public static ListenableFuture gatherStatistics(final StatisticsGatherer statisticsGatheringService, final DeviceContext deviceContext, final MultipartType type) { //FIXME : anytype listener must not be send as parameter, it has to be extracted from device context inside service + final String deviceId = deviceContext.getPrimaryConnectionContext().getNodeId().toString(); + EventIdentifier wholeProcessEventIdentifier = null; + if (MultipartType.OFPMPFLOW.equals(type)) { + wholeProcessEventIdentifier = new EventIdentifier(type.toString(), deviceId); + EventsTimeCounter.markStart(wholeProcessEventIdentifier); + } + EventIdentifier ofpQueuToRequestContextEventIdentifier = new EventIdentifier(QUEUE2_REQCTX + type.toString(), deviceId); final ListenableFuture>> statisticsDataInFuture = - JdkFutureAdapters.listenInPoolThread(statisticsGatheringService.getStatisticsOfType(type)); - return transformAndStoreStatisticsData(statisticsDataInFuture, deviceContext); + JdkFutureAdapters.listenInPoolThread(statisticsGatheringService.getStatisticsOfType( + ofpQueuToRequestContextEventIdentifier, type)); + return transformAndStoreStatisticsData(statisticsDataInFuture, deviceContext, wholeProcessEventIdentifier); } private static ListenableFuture transformAndStoreStatisticsData(final ListenableFuture>> statisticsDataInFuture, - final DeviceContext deviceContext) { + final DeviceContext deviceContext, + final EventIdentifier eventIdentifier) { return Futures.transform(statisticsDataInFuture, new Function>, Boolean>() { @Nullable @Override public Boolean apply(final RpcResult> rpcResult) { if (rpcResult.isSuccessful()) { boolean isMultipartProcessed = Boolean.TRUE; - Iterable allMultipartData = Collections.emptyList(); - DataObject multipartData = null; - for (final MultipartReply singleReply : rpcResult.getResult()) { - final List multipartDataList = MULTIPART_REPLY_TRANSLATOR.translate(deviceContext, singleReply); - multipartData = multipartDataList.get(0); - allMultipartData = Iterables.concat(allMultipartData, multipartDataList); - } - if (deviceContext.getDeviceState().isValid()) { - deviceContext.startGatheringOperationsToOneTransaction(); + // TODO: in case the result value is null then multipart data probably got processed on the fly - + // TODO: this contract should by clearly stated and enforced - now simple true value is returned + if (null != rpcResult.getResult()) { + Iterable allMultipartData = Collections.emptyList(); + DataObject multipartData = null; + for (final MultipartReply singleReply : rpcResult.getResult()) { + final List multipartDataList = MULTIPART_REPLY_TRANSLATOR.translate(deviceContext, singleReply); + multipartData = multipartDataList.get(0); + allMultipartData = Iterables.concat(allMultipartData, multipartDataList); + } + + if (multipartData instanceof GroupStatisticsUpdated) { + processGroupStatistics((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof MeterStatisticsUpdated) { + processMetersStatistics((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof NodeConnectorStatisticsUpdate) { + processNodeConnectorStatistics((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof FlowTableStatisticsUpdate) { + processFlowTableStatistics((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof QueueStatisticsUpdate) { + processQueueStatistics((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof FlowsStatisticsUpdate) { + processFlowStatistics((Iterable) allMultipartData, deviceContext); + EventsTimeCounter.markEnd(eventIdentifier); + } else if (multipartData instanceof GroupDescStatsUpdated) { + processGroupDescStats((Iterable) allMultipartData, deviceContext); + } else if (multipartData instanceof MeterConfigStatsUpdated) { + processMeterConfigStatsUpdated((Iterable) allMultipartData, deviceContext); + } else { + isMultipartProcessed = Boolean.FALSE; + } + //TODO : implement experimenter } - if (multipartData instanceof GroupStatisticsUpdated) { - processGroupStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof MeterStatisticsUpdated) { - processMetersStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof NodeConnectorStatisticsUpdate) { - processNodeConnectorStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof FlowTableStatisticsUpdate) { - processFlowTableStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof QueueStatisticsUpdate) { - processQueueStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof FlowsStatisticsUpdate) { - processFlowStatistics((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof GroupDescStatsUpdated) { - processGroupDescStats((Iterable) allMultipartData, deviceContext); - } else if (multipartData instanceof MeterConfigStatsUpdated) { - processMeterConfigStatsUpdated((Iterable) allMultipartData, deviceContext); - } else { - isMultipartProcessed = Boolean.FALSE; - } - //TODO : implement experimenter - - if (deviceContext.getDeviceState().isValid()) { - deviceContext.commitOperationsGatheredInOneTransaction(); - } return isMultipartProcessed; } return Boolean.FALSE; @@ -169,10 +179,10 @@ public final class StatisticsGatheringUtils { } private static void processMeterConfigStatsUpdated(final Iterable data, final DeviceContext deviceContext) { + final InstanceIdentifier fNodeIdent = assembleFlowCapableNodeInstanceIdentifier(deviceContext); + deleteAllKnownMeters(deviceContext, fNodeIdent); for (final MeterConfigStatsUpdated meterConfigStatsUpdated : data) { - NodeId nodeId = meterConfigStatsUpdated.getId(); - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(nodeId); - for (MeterConfigStats meterConfigStats : meterConfigStatsUpdated.getMeterConfigStats()) { + for (final MeterConfigStats meterConfigStats : meterConfigStatsUpdated.getMeterConfigStats()) { final MeterId meterId = meterConfigStats.getMeterId(); final InstanceIdentifier meterInstanceIdentifier = fNodeIdent.child(Meter.class, new MeterKey(meterId)); @@ -183,49 +193,65 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, meterInstanceIdentifier, meterBuilder.build()); } } + deviceContext.submitTransaction(); } private static void processFlowStatistics(final Iterable data, final DeviceContext deviceContext) { - final NodeId nodeId = deviceContext.getDeviceState().getNodeId(); - final InstanceIdentifier nodeIdent = InstanceIdentifier.create(Nodes.class) - .child(Node.class, new NodeKey(nodeId)); - deleteAllKnownFlows(deviceContext, nodeIdent); + deleteAllKnownFlows(deviceContext); + writeFlowStatistics(data, deviceContext); + deviceContext.submitTransaction(); + } + + public static void writeFlowStatistics(Iterable data, DeviceContext deviceContext) { + final InstanceIdentifier fNodeIdent = assembleFlowCapableNodeInstanceIdentifier(deviceContext); for (final FlowsStatisticsUpdate flowsStatistics : data) { for (final FlowAndStatisticsMapList flowStat : flowsStatistics.getFlowAndStatisticsMapList()) { final FlowBuilder flowBuilder = new FlowBuilder(flowStat); - short tableId = flowStat.getTableId(); + flowBuilder.addAugmentation(FlowStatisticsData.class, refineFlowStatisticsAugmentation(flowStat).build()); + final short tableId = flowStat.getTableId(); final FlowRegistryKey flowRegistryKey = FlowRegistryKeyFactory.create(flowBuilder.build()); final FlowId flowId = deviceContext.getDeviceFlowRegistry().storeIfNecessary(flowRegistryKey, tableId); final FlowKey flowKey = new FlowKey(flowId); flowBuilder.setKey(flowKey); final TableKey tableKey = new TableKey(tableId); - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(flowsStatistics.getId()); final InstanceIdentifier flowIdent = fNodeIdent.child(Table.class, tableKey).child(Flow.class, flowKey); deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, flowIdent, flowBuilder.build()); } } } - private static void deleteAllKnownFlows(final DeviceContext deviceContext, final InstanceIdentifier nodeIdent) { + /** + * Method extracts flow statistics out of flowAndStatistics model + * + * @param flowAndStats + */ + private static FlowStatisticsDataBuilder refineFlowStatisticsAugmentation(final FlowAndStatisticsMapList flowAndStats) { + final FlowStatisticsBuilder flowStatisticsBuilder = new FlowStatisticsBuilder(flowAndStats); + final FlowStatisticsDataBuilder flowStatisticsDataBld = new FlowStatisticsDataBuilder(); + flowStatisticsDataBld.setFlowStatistics(flowStatisticsBuilder.build()); + return flowStatisticsDataBld; + } + + public static void deleteAllKnownFlows(final DeviceContext deviceContext) { if (deviceContext.getDeviceState().deviceSynchronized()) { + InstanceIdentifier flowCapableNodePath = assembleFlowCapableNodeInstanceIdentifier(deviceContext); final Short numOfTablesOnDevice = deviceContext.getDeviceState().getFeatures().getTables(); for (short i = 0; i < numOfTablesOnDevice; i++) { - KeyedInstanceIdentifier iiToTable - = nodeIdent.augmentation(FlowCapableNode.class).child(Table.class, new TableKey(i)); + final KeyedInstanceIdentifier iiToTable = flowCapableNodePath.child(Table.class, new TableKey(i)); final ReadTransaction readTx = deviceContext.getReadTransaction(); - CheckedFuture, ReadFailedException> tableDataFuture = readTx.read(LogicalDatastoreType.OPERATIONAL, iiToTable); + final CheckedFuture, ReadFailedException> tableDataFuture = readTx.read(LogicalDatastoreType.OPERATIONAL, iiToTable); try { - Optional tableDataOpt = tableDataFuture.get(); + final Optional
tableDataOpt = tableDataFuture.get(); if (tableDataOpt.isPresent()) { final Table tableData = tableDataOpt.get(); final Table table = new TableBuilder(tableData).setFlow(Collections.emptyList()).build(); deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, iiToTable, table); } - } catch (InterruptedException e) { + } catch (final InterruptedException e) { LOG.trace("Reading of table features for table wit ID {} was interrputed.", i); - } catch (ExecutionException e) { + } catch (final ExecutionException e) { LOG.trace("Reading of table features for table wit ID {} encountered execution exception {}.", i, e); } } @@ -233,9 +259,8 @@ public final class StatisticsGatheringUtils { } private static void processQueueStatistics(final Iterable data, final DeviceContext deviceContext) { + final InstanceIdentifier nodeIdent = deviceContext.getDeviceState().getNodeInstanceIdentifier(); for (final QueueStatisticsUpdate queueStatisticsUpdate : data) { - final InstanceIdentifier nodeIdent = InstanceIdentifier.create(Nodes.class) - .child(Node.class, new NodeKey(queueStatisticsUpdate.getId())); for (final QueueIdAndStatisticsMap queueStat : queueStatisticsUpdate.getQueueIdAndStatisticsMap()) { if (queueStat.getQueueId() != null) { final FlowCapableNodeConnectorQueueStatistics statChild = @@ -253,11 +278,12 @@ public final class StatisticsGatheringUtils { } } } + deviceContext.submitTransaction(); } private static void processFlowTableStatistics(final Iterable data, final DeviceContext deviceContext) { + final InstanceIdentifier fNodeIdent = assembleFlowCapableNodeInstanceIdentifier(deviceContext); for (final FlowTableStatisticsUpdate flowTableStatisticsUpdate : data) { - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(flowTableStatisticsUpdate.getId()); for (final FlowTableAndStatisticsMap tableStat : flowTableStatisticsUpdate.getFlowTableAndStatisticsMap()) { final InstanceIdentifier tStatIdent = fNodeIdent.child(Table.class, new TableKey(tableStat.getTableId().getValue())) @@ -266,12 +292,12 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, tStatIdent, stats); } } + deviceContext.submitTransaction(); } private static void processNodeConnectorStatistics(final Iterable data, final DeviceContext deviceContext) { + final InstanceIdentifier nodeIdent = deviceContext.getDeviceState().getNodeInstanceIdentifier(); for (final NodeConnectorStatisticsUpdate nodeConnectorStatisticsUpdate : data) { - final InstanceIdentifier nodeIdent = InstanceIdentifier.create(Nodes.class) - .child(Node.class, new NodeKey(nodeConnectorStatisticsUpdate.getId())); for (final NodeConnectorStatisticsAndPortNumberMap nConnectPort : nodeConnectorStatisticsUpdate.getNodeConnectorStatisticsAndPortNumberMap()) { final FlowCapableNodeConnectorStatistics stats = new FlowCapableNodeConnectorStatisticsBuilder(nConnectPort).build(); final NodeConnectorKey key = new NodeConnectorKey(nConnectPort.getNodeConnectorId()); @@ -283,14 +309,13 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, flowCapNodeConnStatIdent, stats); } } + deviceContext.submitTransaction(); } private static void processMetersStatistics(final Iterable data, final DeviceContext deviceContext) { - NodeId nodeId = deviceContext.getDeviceState().getNodeId(); - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(nodeId); - deleteAllKnownMeters(deviceContext, fNodeIdent); - for (MeterStatisticsUpdated meterStatisticsUpdated : data) { + final InstanceIdentifier fNodeIdent = assembleFlowCapableNodeInstanceIdentifier(deviceContext); + for (final MeterStatisticsUpdated meterStatisticsUpdated : data) { for (final MeterStats mStat : meterStatisticsUpdated.getMeterStats()) { final MeterStatistics stats = new MeterStatisticsBuilder(mStat).build(); final MeterId meterId = mStat.getMeterId(); @@ -301,10 +326,11 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, msIdent, stats); } } + deviceContext.submitTransaction(); } private static void deleteAllKnownMeters(final DeviceContext deviceContext, final InstanceIdentifier fNodeIdent) { - for (MeterId meterId : deviceContext.getDeviceMeterRegistry().getAllMeterIds()) { + for (final MeterId meterId : deviceContext.getDeviceMeterRegistry().getAllMeterIds()) { final InstanceIdentifier meterIdent = fNodeIdent.child(Meter.class, new MeterKey(meterId)); deviceContext.addDeleteToTxChain(LogicalDatastoreType.OPERATIONAL, meterIdent); } @@ -312,11 +338,12 @@ public final class StatisticsGatheringUtils { } private static void processGroupDescStats(final Iterable data, final DeviceContext deviceContext) { - for (GroupDescStatsUpdated groupDescStatsUpdated : data) { - NodeId nodeId = groupDescStatsUpdated.getId(); - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(nodeId); + final InstanceIdentifier fNodeIdent = + deviceContext.getDeviceState().getNodeInstanceIdentifier().augmentation(FlowCapableNode.class); + deleteAllKnownGroups(deviceContext, fNodeIdent); - for (GroupDescStats groupDescStats : groupDescStatsUpdated.getGroupDescStats()) { + for (final GroupDescStatsUpdated groupDescStatsUpdated : data) { + for (final GroupDescStats groupDescStats : groupDescStatsUpdated.getGroupDescStats()) { final GroupId groupId = groupDescStats.getGroupId(); final GroupBuilder groupBuilder = new GroupBuilder(groupDescStats); @@ -329,10 +356,11 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, groupIdent, groupBuilder.build()); } } + deviceContext.submitTransaction(); } private static void deleteAllKnownGroups(final DeviceContext deviceContext, final InstanceIdentifier fNodeIdent) { - for (GroupId groupId : deviceContext.getDeviceGroupRegistry().getAllGroupIds()) { + for (final GroupId groupId : deviceContext.getDeviceGroupRegistry().getAllGroupIds()) { final InstanceIdentifier groupIdent = fNodeIdent.child(Group.class, new GroupKey(groupId)); deviceContext.addDeleteToTxChain(LogicalDatastoreType.OPERATIONAL, groupIdent); } @@ -340,10 +368,8 @@ public final class StatisticsGatheringUtils { } private static void processGroupStatistics(final Iterable data, final DeviceContext deviceContext) { - NodeId nodeId = deviceContext.getDeviceState().getNodeId(); - final InstanceIdentifier fNodeIdent = getFlowCapableNodeInstanceIdentifier(nodeId); - deleteAllKnownGroups(deviceContext, fNodeIdent); - for (GroupStatisticsUpdated groupStatistics : data) { + final InstanceIdentifier fNodeIdent = assembleFlowCapableNodeInstanceIdentifier(deviceContext); + for (final GroupStatisticsUpdated groupStatistics : data) { for (final GroupStats groupStats : groupStatistics.getGroupStats()) { final InstanceIdentifier groupIdent = fNodeIdent.child(Group.class, new GroupKey(groupStats.getGroupId())); @@ -355,11 +381,10 @@ public final class StatisticsGatheringUtils { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, gsIdent, stats); } } + deviceContext.submitTransaction(); } - private static InstanceIdentifier getFlowCapableNodeInstanceIdentifier(final NodeId nodeId) { - final InstanceIdentifier nodeIdent = InstanceIdentifier - .create(Nodes.class).child(Node.class, new NodeKey(nodeId)); - return nodeIdent.augmentation(FlowCapableNode.class); + private static InstanceIdentifier assembleFlowCapableNodeInstanceIdentifier(final DeviceContext deviceContext) { + return deviceContext.getDeviceState().getNodeInstanceIdentifier().augmentation(FlowCapableNode.class); } }