X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Futil%2FDeviceInitializationUtils.java;h=0bdbe08a9c82e01be756b0cabec21d027f6a2863;hb=9f8a5a168696e279ae49ed79efe4590abc49b9ba;hp=8d5061cd13e697e076ce9ddfc4e7ae574e82eb5a;hpb=5307c33b40394070417c6dcfe17e31e7f8a29c69;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/DeviceInitializationUtils.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/DeviceInitializationUtils.java index 8d5061cd13..0bdbe08a9c 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/DeviceInitializationUtils.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/DeviceInitializationUtils.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.ExecutionException; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; @@ -37,9 +38,10 @@ import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey; import org.opendaylight.openflowplugin.impl.common.MultipartRequestInputFactory; import org.opendaylight.openflowplugin.impl.common.NodeStaticReplyTranslatorUtil; import org.opendaylight.openflowplugin.impl.rpc.AbstractRequestContext; +import org.opendaylight.openflowplugin.openflow.md.core.sal.SwitchFeaturesUtil; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; -import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; @@ -58,6 +60,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111. import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.CapabilitiesV10; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping; @@ -107,7 +110,7 @@ public class DeviceInitializationUtils { final ConnectionContext connectionContext = Preconditions.checkNotNull(deviceContext.getPrimaryConnectionContext()); final short version = deviceInfo.getVersion(); LOG.trace("initalizeNodeInformation for node {}", deviceInfo.getNodeId()); - final SettableFuture returnFuture = SettableFuture.create(); + final SettableFuture returnFuture = SettableFuture.create(); addNodeToOperDS(deviceContext, returnFuture); final ListenableFuture>>> deviceFeaturesFuture; if (OFConstants.OFP_VERSION_1_0 == version) { @@ -159,7 +162,7 @@ public class DeviceInitializationUtils { private static void addNodeToOperDS(final DeviceContext deviceContext, final SettableFuture future) { Preconditions.checkArgument(deviceContext != null); final NodeBuilder nodeBuilder = new NodeBuilder().setId(deviceContext.getDeviceInfo().getNodeId()).setNodeConnector( - Collections.emptyList()); + Collections.emptyList()); try { deviceContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, deviceContext.getDeviceInfo().getNodeInstanceIdentifier(), nodeBuilder.build()); @@ -208,7 +211,7 @@ public class DeviceInitializationUtils { final ListenableFuture>> replyTableFeatures; - if (deviceContext.isSkipTableFeatures()){ + if (deviceContext.isSkipTableFeatures()) { replyTableFeatures = RpcResultBuilder.>success().buildFuture(); } else { replyTableFeatures = getNodeStaticInfo( @@ -238,20 +241,26 @@ public class DeviceInitializationUtils { static void translateAndWriteReply(final MultipartType type, final DeviceContext dContext, final InstanceIdentifier nodeII, final Collection result, final ConvertorExecutor convertorExecutor) { - try { - result.stream() - .map(MultipartReply::getMultipartReplyBody) - .forEach(multipartReplyBody -> { - if (!(writeDesc(type, multipartReplyBody, dContext, nodeII) - || writeTableFeatures(type, multipartReplyBody, dContext, nodeII, convertorExecutor) - || writeMeterFeatures(type, multipartReplyBody, dContext, nodeII) - || writeGroupFeatures(type, multipartReplyBody, dContext, nodeII) - || writePortDesc(type, multipartReplyBody, dContext, nodeII))) { - throw new IllegalArgumentException("Unexpected MultipartType " + type); - } - }); - } catch (final Exception e) { - LOG.debug("translateAndWriteReply: Failed to write node {} to DS ", dContext.getDeviceInfo().getNodeId().toString(), e); + if (Objects.nonNull(result)) { + try { + result.stream() + .map(MultipartReply::getMultipartReplyBody) + .forEach(multipartReplyBody -> { + if (!(writeDesc(type, multipartReplyBody, dContext, nodeII) + || writeTableFeatures(type, multipartReplyBody, dContext, nodeII, convertorExecutor) + || writeMeterFeatures(type, multipartReplyBody, dContext, nodeII) + || writeGroupFeatures(type, multipartReplyBody, dContext, nodeII) + || writePortDesc(type, multipartReplyBody, dContext, nodeII))) { + throw new IllegalArgumentException("Unexpected MultipartType " + type); + } + }); + } catch (final Exception e) { + LOG.debug("translateAndWriteReply: Failed to write node {} to DS ", dContext.getDeviceInfo().getNodeId().toString(), e); + } + } else { + LOG.debug("translateAndWriteReply: Failed to write node {} to DS because we failed to gather device" + + "info.", + dContext.getDeviceInfo().getNodeId().toString()); } } @@ -265,8 +274,12 @@ public class DeviceInitializationUtils { Preconditions.checkArgument(body instanceof MultipartReplyDescCase); final MultipartReplyDesc replyDesc = ((MultipartReplyDescCase) body).getMultipartReplyDesc(); - final FlowCapableNode fcNode = NodeStaticReplyTranslatorUtil.nodeDescTranslator(replyDesc, - getIpAddressOf(dContext)); + final FlowCapableNode fcNode = NodeStaticReplyTranslatorUtil + .nodeDescTranslator(replyDesc, getIpAddressOf(dContext)) + .setSwitchFeatures(SwitchFeaturesUtil.getInstance().buildSwitchFeatures( + new GetFeaturesOutputBuilder(dContext.getPrimaryConnectionContext().getFeatures()).build())) + .build(); + final InstanceIdentifier fNodeII = nodeII.augmentation(FlowCapableNode.class); dContext.writeToTransaction(LogicalDatastoreType.OPERATIONAL, fNodeII, fcNode); return true; @@ -416,7 +429,9 @@ public class DeviceInitializationUtils { // FIXME : remove after ovs tableFeatures fix private static void makeEmptyTables(final DeviceContext dContext, final InstanceIdentifier nodeII, final Short nrOfTables) { - LOG.debug("About to create {} empty tables.", nrOfTables); + if (LOG.isDebugEnabled()) { + LOG.debug("About to create {} empty tables.", nrOfTables); + } for (int i = 0; i < nrOfTables; i++) { final short tId = (short) i; final InstanceIdentifier tableII = nodeII.augmentation(FlowCapableNode.class).child(Table.class, @@ -447,7 +462,7 @@ public class DeviceInitializationUtils { } else { for (RpcError rpcError : rpcResult.getErrors()) { LOG.info("Failed to retrieve static node {} info: {}", type, rpcError.getMessage()); - if (null != rpcError.getCause()) { + if (LOG.isTraceEnabled() && Objects.nonNull(rpcError.getCause())) { LOG.trace("Detailed error:", rpcError.getCause()); } } @@ -466,7 +481,9 @@ public class DeviceInitializationUtils { } private static ListenableFuture>> getNodeStaticInfo(final MultipartType type, - final DeviceContext deviceContext, final InstanceIdentifier nodeII, final short version) { + final DeviceContext deviceContext, + final InstanceIdentifier nodeII, + final short version) { final OutboundQueue queue = deviceContext.getPrimaryConnectionContext().getOutboundQueueProvider(); @@ -481,6 +498,11 @@ public class DeviceInitializationUtils { final Xid xid = requestContext.getXid(); + if (Objects.isNull(xid)) { + LOG.debug("Xid is not present, so cancelling node static info gathering."); + return Futures.immediateCancelledFuture(); + } + LOG.trace("Hooking xid {} to device context - precaution.", reserved); final MultiMsgCollector multiMsgCollector = deviceContext.getMultiMsgCollector(requestContext); @@ -521,21 +543,30 @@ public class DeviceInitializationUtils { final ListenableFuture>>> deviceFeaturesFuture) { try { - LOG.trace("Waiting for protocol version 1.0"); + if (LOG.isTraceEnabled()) { + LOG.trace("Waiting for protocol version 1.0"); + } List>> results = deviceFeaturesFuture.get(); boolean allSucceeded = true; for (final RpcResult> rpcResult : results) { allSucceeded &= rpcResult.isSuccessful(); } if (allSucceeded) { - LOG.debug("Creating emtpy flow capable node: {}", deviceContext.getDeviceInfo().getNodeId().getValue()); + if (LOG.isDebugEnabled()) { + LOG.debug("Creating empty flow capable node: {}", deviceContext.getDeviceInfo().getLOGValue()); + } createEmptyFlowCapableNodeInDs(deviceContext); - LOG.debug("Creating emtpy tables for {}", deviceContext.getDeviceInfo().getNodeId().getValue()); + if (LOG.isDebugEnabled()) { + LOG.debug("Creating empty tables for {}", deviceContext.getDeviceInfo().getLOGValue()); + } makeEmptyTables(deviceContext, deviceContext.getDeviceInfo().getNodeInstanceIdentifier(), deviceContext.getPrimaryConnectionContext().getFeatures().getTables()); } } catch (InterruptedException | ExecutionException e) { - LOG.warn("Error occurred in preparation node {} for protocol 1.0", deviceContext.getDeviceInfo().getNodeId().getValue()); + LOG.warn("Error occurred in preparation node {} for protocol 1.0", deviceContext.getDeviceInfo().getLOGValue()); + if (LOG.isTraceEnabled()) { + LOG.trace("Error for node {} : ", deviceContext.getDeviceInfo().getLOGValue(), e); + } } } }