group statistics request asks for ALL not ANY
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / common / MultipartRequestInputFactory.java
1 /**
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.common;
10
11 import com.google.common.base.Preconditions;
12 import java.math.BigInteger;
13 import javax.annotation.CheckForNull;
14 import javax.annotation.Nonnull;
15 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
16 import org.opendaylight.openflowplugin.api.OFConstants;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
62
63 /**
64  * openflowplugin-impl
65  * org.opendaylight.openflowplugin.impl.common
66  * <p/>
67  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
68  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
69  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
70  * {@see https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf}
71  *
72  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
73  *         <p/>
74  *         Created: Mar 27, 2015
75  */
76 public final class MultipartRequestInputFactory {
77
78     private MultipartRequestInputFactory() {
79         throw new UnsupportedOperationException("Factory class");
80     }
81
82     /**
83      * Method validate input and makes {@link MultipartRequestInput} from input values. Method set
84      * a moreRequest marker to false and it creates default empty {@link MultipartRequestBody}
85      * by {@link MultipartType}
86      *
87      * @param xid
88      * @param type
89      * @param ofVersion
90      * @return
91      */
92     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
93                                                                   @Nonnull final MultipartType type) {
94         return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type));
95     }
96
97     /**
98      * Method validate input values and makes {@link MultipartRequestInput} from input values. Method set
99      * a moreRequest marker to false.
100      *
101      * @param xid
102      * @param type
103      * @param ofVersion
104      * @param body
105      * @return
106      */
107     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
108                                                                   @Nonnull final MultipartType type, @Nonnull final MultipartRequestBody body) {
109         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
110         return maker(xid, type, ofVersion, false, body);
111     }
112
113     /**
114      * Method validates input and makes {@link MultipartRequestInput} from input values. Method creates
115      * default empty {@link MultipartRequestBody} by {@link MultipartType}
116      *
117      * @param xid
118      * @param type
119      * @param ofVersion
120      * @param moreRequests
121      * @return
122      */
123     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
124                                                                   @Nonnull final MultipartType type, final boolean moreRequests) {
125         return maker(xid, type, ofVersion, moreRequests, makeDefaultEmptyRequestBody(type));
126     }
127
128     /**
129      * Method validates input values and makes {@link MultipartRequestInput} from input values.
130      *
131      * @param xid
132      * @param type
133      * @param ofVersion
134      * @param moreRequests
135      * @param body
136      * @return
137      */
138     public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
139                                                                   @Nonnull final MultipartType type, final boolean moreRequests,
140                                                                   @Nonnull final MultipartRequestBody body) {
141         Preconditions.checkArgument(validationOfMultipartTypeAndRequestBody(type, body));
142         return maker(xid, type, ofVersion, moreRequests, body);
143     }
144
145     /**
146      * Method build {@link MultipartRequestInput} from input values. It is private because we would like
147      * to validate only what is really need to be validate.
148      *
149      * @param xid
150      * @param type
151      * @param ofVersion
152      * @param moreRequests
153      * @param body
154      * @return
155      */
156     private static MultipartRequestInput maker(final long xid, final MultipartType type,
157                                                final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
158         final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
159         builder.setFlags(new MultipartRequestFlags(moreRequests));
160         builder.setMultipartRequestBody(body);
161         builder.setVersion(ofVersion);
162         builder.setType(type);
163         builder.setXid(xid);
164         return builder.build();
165     }
166
167     private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type) {
168         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
169         switch (type) {
170             case OFPMPDESC:
171                 return new MultipartRequestDescCaseBuilder().build();
172             case OFPMPFLOW:
173                 MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
174                 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
175                 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
176                 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
177                 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
178                 multipartRequestFlowBuilder.setCookie(BigInteger.ZERO);
179                 multipartRequestFlowBuilder.setCookieMask(BigInteger.ZERO);
180                 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
181                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
182                 return multipartRequestFlowCaseBuilder.build();
183             case OFPMPAGGREGATE:
184                 return new MultipartRequestAggregateCaseBuilder().build();
185             case OFPMPTABLE:
186                 return new MultipartRequestTableCaseBuilder().build();
187             case OFPMPPORTSTATS:
188                 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
189                 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
190                 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
191                 multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
192                 return multipartRequestPortStatsCaseBuilder.build();
193             case OFPMPQUEUE:
194                 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = new MultipartRequestQueueCaseBuilder();
195                 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
196                 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
197                 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
198                 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
199                 return multipartRequestQueueCaseBuilder.build();
200             case OFPMPGROUP:
201                 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
202                 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
203                 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
204                 multipartRequestGroupBuilder.setGroupId(groupId);
205                 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
206                 return multipartRequestGroupCaseBuilder.build();
207             case OFPMPGROUPDESC:
208                 return new MultipartRequestGroupDescCaseBuilder().build();
209             case OFPMPGROUPFEATURES:
210                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
211             case OFPMPMETER:
212                 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
213                 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
214                 MeterId meterId = new MeterId(OFConstants.OFPP_ANY);
215                 multipartRequestMeterBuilder.setMeterId(meterId);
216                 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
217                 return multipartRequestMeterCaseBuilder.build();
218             case OFPMPMETERCONFIG:
219                 return new MultipartRequestMeterConfigCaseBuilder().build();
220             case OFPMPMETERFEATURES:
221                 return new MultipartRequestMeterFeaturesCaseBuilder().build();
222             case OFPMPTABLEFEATURES:
223                 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
224                 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
225                 return tableFeaturesCaseBuilder.build();
226             case OFPMPPORTDESC:
227                 return new MultipartRequestPortDescCaseBuilder().build();
228             case OFPMPEXPERIMENTER:
229                 return new MultipartRequestExperimenterCaseBuilder().build();
230             default:
231                 throw new IllegalArgumentException("Unknown MultipartType " + type);
232         }
233     }
234
235     private static boolean validationOfMultipartTypeAndRequestBody(@CheckForNull final MultipartType type,
236                                                                    @CheckForNull final MultipartRequestBody body) {
237         Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
238         Preconditions.checkArgument(body != null, "Multipart Request can not by build without body!");
239         switch (type) {
240             case OFPMPDESC:
241                 return body instanceof MultipartRequestDescCase;
242             case OFPMPFLOW:
243                 return body instanceof MultipartRequestFlowCase;
244             case OFPMPAGGREGATE:
245                 return body instanceof MultipartRequestAggregateCase;
246             case OFPMPTABLE:
247                 return body instanceof MultipartRequestTableCase;
248             case OFPMPPORTSTATS:
249                 return body instanceof MultipartRequestPortStatsCase;
250             case OFPMPQUEUE:
251                 return body instanceof MultipartRequestQueueCase;
252             case OFPMPGROUP:
253                 return body instanceof MultipartRequestGroupCase;
254             case OFPMPGROUPDESC:
255                 return body instanceof MultipartRequestGroupDescCase;
256             case OFPMPGROUPFEATURES:
257                 return body instanceof MultipartRequestGroupFeaturesCase;
258             case OFPMPMETER:
259                 return body instanceof MultipartRequestMeterCase;
260             case OFPMPMETERCONFIG:
261                 return body instanceof MultipartRequestMeterConfigCase;
262             case OFPMPMETERFEATURES:
263                 return body instanceof MultipartRequestMeterFeaturesCase;
264             case OFPMPTABLEFEATURES:
265                 return body instanceof MultipartRequestTableFeaturesCase;
266             case OFPMPPORTDESC:
267                 return body instanceof MultipartRequestPortDescCase;
268             case OFPMPEXPERIMENTER:
269                 return body instanceof MultipartRequestExperimenterCase;
270             default:
271                 throw new IllegalArgumentException("Unknown MultipartType " + type);
272         }
273     }
274 }