X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fcore%2Fsession%2FMessageDispatchServiceImpl.java;h=0f127e83389f17a755aea4e92d2c9c149914d3dd;hb=6c5b15ecf3821d327cc844d4fd3f854e1220577d;hp=7d8f43cdbbf2968e9bb3f343f4de99ba4170177e;hpb=7660dc2c12b1fbc607db46b0817c9f7bc3beed46;p=openflowplugin.git diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImpl.java index 7d8f43cdbb..0f127e8338 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImpl.java @@ -1,10 +1,28 @@ +/** + * Copyright IBM Corporation, 2013. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.openflowplugin.openflow.md.core.session; +import java.math.BigInteger; +import java.util.Collection; +import java.util.Collections; import java.util.concurrent.Future; +import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput; @@ -19,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput; @@ -26,10 +45,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutputBuilder; +import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.util.concurrent.Futures; + /** * message dispatch service to send the message to switch. * @@ -40,7 +64,7 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { private static final Logger LOG = LoggerFactory.getLogger(MessageDispatchServiceImpl.class); - private SessionContext session; + private SessionContext session; /** * constructor @@ -49,13 +73,13 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { * - MessageDispatchService for this session */ public MessageDispatchServiceImpl(SessionContext session) { - this.session = session; + this.session = session; } /** * get proper connection adapter to send the message to switch. * - * @param - cookie to identify the right connection, it can be null also. + * @param cookie to identify the right connection, it can be null also. * @return connectionAdapter associated with cookie, otherwise return best * suitable connection. * @@ -65,7 +89,8 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { if (!session.isValid()) { LOG.warn("Session for the cookie {} is invalid.", cookie); - throw new IllegalArgumentException("Session for the cookie is invalid."); + throw new IllegalArgumentException("Session for the cookie is invalid. Reason: " + + "the switch has been recently disconnected OR inventory provides outdated information."); } LOG.debug("finding connecton for cookie value {}. ", cookie); // set main connection as default @@ -84,7 +109,7 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { } @Override - public Future> barrier(BarrierInput input, SwitchConnectionDistinguisher cookie) { + public Future> barrier(BarrierInput input, SwitchConnectionDistinguisher cookie) { return getConnectionAdapter(cookie).barrier(input); } @@ -94,8 +119,24 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { } @Override - public Future> flowMod(FlowModInput input, SwitchConnectionDistinguisher cookie) { - return getConnectionAdapter(cookie).flowMod(input); + public Future> flowMod(FlowModInput input, SwitchConnectionDistinguisher cookie) { + LOG.debug("Calling OFLibrary flowMod"); + Future> response = getConnectionAdapter(cookie).flowMod(input); + + // Send the same Xid back to caller - MessageDrivenSwitch + UpdateFlowOutputBuilder flowModOutput = new UpdateFlowOutputBuilder(); + BigInteger bigIntXid = BigInteger.valueOf(input.getXid()) ; + flowModOutput.setTransactionId(new TransactionId(bigIntXid)); + + UpdateFlowOutput result = flowModOutput.build(); + Collection errors = Collections.emptyList(); + RpcResult rpcResult = Rpcs.getRpcResult(true, result, errors); + + // solution 1: sending directly and hooking listener to get error + // hookup listener to catch the possible error with no reference to returned future-object + LOG.debug("Returning to ModelDrivenSwitch for flowMod RPC"); + return Futures.immediateFuture(rpcResult); + } @Override @@ -120,13 +161,50 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { } @Override - public Future> groupMod(GroupModInput input, SwitchConnectionDistinguisher cookie) { - return getConnectionAdapter(cookie).groupMod(input); + public Future> groupMod(GroupModInput input, SwitchConnectionDistinguisher cookie) { + LOG.debug("Calling OFLibrary groupMod"); + Future> response = getConnectionAdapter(cookie).groupMod(input); + + // Send the same Xid back to caller - MessageDrivenSwitch + UpdateGroupOutputBuilder groupModOutput = new UpdateGroupOutputBuilder(); + BigInteger bigIntXid = BigInteger.valueOf(input.getXid()); + groupModOutput.setTransactionId(new TransactionId(bigIntXid)); + + UpdateGroupOutput result = groupModOutput.build(); + Collection errors = Collections.emptyList(); + RpcResult rpcResult = Rpcs.getRpcResult(true, result, errors); + + // solution 1: sending directly and hooking listener to get error + // hookup listener to catch the possible error with no reference to returned future-object + LOG.debug("Returning to ModelDrivenSwitch for groupMod RPC"); + return Futures.immediateFuture(rpcResult); + } @Override - public Future> meterMod(MeterModInput input, SwitchConnectionDistinguisher cookie) { - return getConnectionAdapter(cookie).meterMod(input); + public Future> meterMod(MeterModInput input, SwitchConnectionDistinguisher cookie) { + LOG.debug("Calling OFLibrary meterMod"); + Future> response = getConnectionAdapter(cookie).meterMod(input); + + // Send the same Xid back to caller - MessageDrivenSwitch + UpdateMeterOutputBuilder meterModOutput = new UpdateMeterOutputBuilder(); + BigInteger bigIntXid =BigInteger.valueOf(input.getXid()); + meterModOutput.setTransactionId(new TransactionId(bigIntXid)); + + UpdateMeterOutput result = meterModOutput.build(); + Collection errors = Collections.emptyList(); + RpcResult rpcResult = Rpcs.getRpcResult(true, result, errors); + + // solution 1: sending directly and hooking listener to get error + // hookup listener to catch the possible error with no reference to returned future-object + LOG.debug("Returning to ModelDrivenSwitch for meterMod RPC"); + return Futures.immediateFuture(rpcResult); + + } + + @Override + public Future> multipartRequest(MultipartRequestInput input, SwitchConnectionDistinguisher cookie) { + return getConnectionAdapter(cookie).multipartRequest(input); } @Override @@ -135,8 +213,22 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { } @Override - public Future> portMod(PortModInput input, SwitchConnectionDistinguisher cookie) { - return getConnectionAdapter(cookie).portMod(input); + public Future> portMod(PortModInput input, SwitchConnectionDistinguisher cookie) { + + LOG.debug("Calling OFLibrary portMod"); + Future> response = getConnectionAdapter(cookie).portMod(input); + + // Send the same Xid back to caller - ModelDrivenSwitch + UpdatePortOutputBuilder portModOutput = new UpdatePortOutputBuilder(); + String stringXid =input.getXid().toString(); + BigInteger bigIntXid = new BigInteger( stringXid ); + portModOutput.setTransactionId(new TransactionId(bigIntXid)); + UpdatePortOutput result = portModOutput.build(); + Collection errors = Collections.emptyList(); + RpcResult rpcResult = Rpcs.getRpcResult(true, result, errors); + + LOG.debug("Returning to ModelDrivenSwitch for portMod RPC"); + return Futures.immediateFuture(rpcResult); } @Override @@ -158,5 +250,4 @@ public class MessageDispatchServiceImpl implements IMessageDispatchService { public Future> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie) { return getConnectionAdapter(cookie).tableMod(input); } - }