Merge "Added a distribution directory that excludes old OF plugin and includes new...
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / session / MessageDispatchServiceImpl.java
1 package org.opendaylight.openflowplugin.openflow.md.core.session;
2
3 import java.util.concurrent.Future;
4
5 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
6 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
7 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
29 import org.opendaylight.yangtools.yang.common.RpcResult;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 /**
34  * message dispatch service to send the message to switch.
35  *
36  * @author AnilGujele
37  *
38  */
39 public class MessageDispatchServiceImpl implements IMessageDispatchService {
40
41     private static final Logger LOG = LoggerFactory.getLogger(MessageDispatchServiceImpl.class);
42
43     private SessionContext session;
44
45     /**
46      * constructor
47      *
48      * @param session
49      *            - MessageDispatchService for this session
50      */
51     public MessageDispatchServiceImpl(SessionContext session) {
52         this.session = session;
53     }
54
55     /**
56      * get proper connection adapter to send the message to switch.
57      *
58      * @param - cookie to identify the right connection, it can be null also.
59      * @return connectionAdapter associated with cookie, otherwise return best
60      *         suitable connection.
61      *
62      */
63
64     private ConnectionAdapter getConnectionAdapter(SwitchConnectionDistinguisher cookie) {
65
66         if (!session.isValid()) {
67             LOG.warn("Session for the cookie {} is invalid.", cookie);
68             throw new IllegalArgumentException("Session for the cookie is invalid.");
69         }
70         LOG.debug("finding connecton for cookie value {}. ", cookie);
71         // set main connection as default
72         ConnectionAdapter connectionAdapter = session.getPrimaryConductor().getConnectionAdapter();
73         if (null != cookie) {
74             ConnectionConductor conductor = session.getAuxiliaryConductor(cookie);
75             // check if auxiliary connection exist
76             if (null != conductor) {
77                 LOG.debug("found auxiliary connection for the cookie.");
78                 connectionAdapter = conductor.getConnectionAdapter();
79             }
80         } else {
81             // TODO: pick connection to utilize all the available connection.
82         }
83         return connectionAdapter;
84     }
85
86     @Override
87     public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input, SwitchConnectionDistinguisher cookie) {
88         return getConnectionAdapter(cookie).barrier(input);
89     }
90
91     @Override
92     public Future<RpcResult<Void>> experimenter(ExperimenterInput input, SwitchConnectionDistinguisher cookie) {
93         return getConnectionAdapter(cookie).experimenter(input);
94     }
95
96     @Override
97     public Future<RpcResult<Void>> flowMod(FlowModInput input, SwitchConnectionDistinguisher cookie) {
98         return getConnectionAdapter(cookie).flowMod(input);
99     }
100
101     @Override
102     public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input, SwitchConnectionDistinguisher cookie) {
103         return getConnectionAdapter(cookie).getAsync(input);
104     }
105
106     @Override
107     public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input, SwitchConnectionDistinguisher cookie) {
108         return getConnectionAdapter(cookie).getConfig(input);
109     }
110
111     @Override
112     public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input, SwitchConnectionDistinguisher cookie) {
113         return getConnectionAdapter(cookie).getFeatures(input);
114     }
115
116     @Override
117     public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input,
118             SwitchConnectionDistinguisher cookie) {
119         return getConnectionAdapter(cookie).getQueueConfig(input);
120     }
121
122     @Override
123     public Future<RpcResult<Void>> groupMod(GroupModInput input, SwitchConnectionDistinguisher cookie) {
124         return getConnectionAdapter(cookie).groupMod(input);
125     }
126
127     @Override
128     public Future<RpcResult<Void>> meterMod(MeterModInput input, SwitchConnectionDistinguisher cookie) {
129         return getConnectionAdapter(cookie).meterMod(input);
130     }
131
132     @Override
133     public Future<RpcResult<Void>> packetOut(PacketOutInput input, SwitchConnectionDistinguisher cookie) {
134         return getConnectionAdapter(cookie).packetOut(input);
135     }
136
137     @Override
138     public Future<RpcResult<Void>> portMod(PortModInput input, SwitchConnectionDistinguisher cookie) {
139         return getConnectionAdapter(cookie).portMod(input);
140     }
141
142     @Override
143     public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input, SwitchConnectionDistinguisher cookie) {
144         return getConnectionAdapter(cookie).roleRequest(input);
145     }
146
147     @Override
148     public Future<RpcResult<Void>> setAsync(SetAsyncInput input, SwitchConnectionDistinguisher cookie) {
149         return getConnectionAdapter(cookie).setAsync(input);
150     }
151
152     @Override
153     public Future<RpcResult<Void>> setConfig(SetConfigInput input, SwitchConnectionDistinguisher cookie) {
154         return getConnectionAdapter(cookie).setConfig(input);
155     }
156
157     @Override
158     public Future<RpcResult<Void>> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie) {
159         return getConnectionAdapter(cookie).tableMod(input);
160     }
161
162 }