Fix opendaylight-flow-types.yang cases
[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 javax.annotation.Nonnull;
12 import org.opendaylight.openflowplugin.api.OFConstants;
13 import org.opendaylight.openflowplugin.impl.util.MatchUtil;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.request.multipart.request.body.MultipartRequestFlowTableStatsBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.multipart.request.multipart.request.body.MultipartRequestPortDescBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowAggregateStatsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.MultipartRequestFlowStatsBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.multipart.request.multipart.request.body.multipart.request.flow.stats.FlowStatsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupStatsBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterStatsBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
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.MultipartRequestPortStatsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
61
62 /**
63  * openflowplugin-impl
64  * org.opendaylight.openflowplugin.impl.common
65  * Factory class is designed for easy producing a MultipartRequestInput. Class should help
66  * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
67  * without touch OF specification 1.3.2  - a section 7.3.5. Multipart Messages
68  */
69 public final class MultipartRequestInputFactory {
70
71     private MultipartRequestInputFactory() {
72         throw new UnsupportedOperationException("Factory class");
73     }
74
75     /**
76      * Method validate input and makes
77      * {@link org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader}
78      * from input values. Method set a moreRequest marker to false and it creates default empty multipart request body
79      * by {@link MultipartType}
80      *
81      * @param xid xid
82      * @param version OpenFlow version
83      * @param type multipart type
84      * @param canUseSingleLayer can use single layer serialization
85      * @return multipart request
86      */
87     public static OfHeader makeMultipartRequest(final long xid,
88                                                 final short version,
89                                                 @Nonnull final MultipartType type,
90                                                 final boolean canUseSingleLayer) {
91         return canUseSingleLayer
92                 ? new MultipartRequestBuilder()
93                     .setRequestMore(false)
94                     .setVersion(version)
95                     .setXid(xid)
96                     .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
97                     .build()
98                 : new MultipartRequestInputBuilder()
99                     .setFlags(new MultipartRequestFlags(false))
100                     .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
101                     .setVersion(version)
102                     .setType(type)
103                     .setXid(xid)
104                     .build();
105     }
106
107     private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
108         .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
109         switch (type) {
110             case OFPMPDESC: return new MultipartRequestDescBuilder().build();
111             case OFPMPFLOW: return new MultipartRequestFlowStatsBuilder().setFlowStats(new FlowStatsBuilder()
112                 .setMatch(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow
113                     .MatchBuilder().build()).build()).build();
114             case OFPMPAGGREGATE: return new MultipartRequestFlowAggregateStatsBuilder().build();
115             case OFPMPTABLE: return new MultipartRequestFlowTableStatsBuilder().build();
116             case OFPMPPORTSTATS: return new org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics
117                     .rev131214.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder().build();
118             case OFPMPQUEUE: return new MultipartRequestQueueStatsBuilder().build();
119             case OFPMPGROUP: return new MultipartRequestGroupStatsBuilder().build();
120             case OFPMPGROUPDESC: return new MultipartRequestGroupDescBuilder().build();
121             case OFPMPGROUPFEATURES: return new MultipartRequestGroupFeaturesBuilder().build();
122             case OFPMPMETER: return new MultipartRequestMeterStatsBuilder().build();
123             case OFPMPMETERCONFIG: return new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics
124                     .rev131111.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder().build();
125             case OFPMPMETERFEATURES: return new MultipartRequestMeterFeaturesBuilder().build();
126             case OFPMPTABLEFEATURES: return new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types
127                     .rev131026.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder().build();
128             case OFPMPPORTDESC: return new MultipartRequestPortDescBuilder().build();
129             case OFPMPEXPERIMENTER: return new MultipartRequestExperimenterBuilder().build();
130             default:throw new IllegalArgumentException("Unknown MultipartType " + type);
131         }
132     }
133
134     private static MultipartRequestBody makeDefaultMultiLayerBody(@Nonnull final MultipartType type,
135                                                                   final short version) {
136         switch (type) {
137             case OFPMPDESC:
138                 return new MultipartRequestDescCaseBuilder().build();
139             case OFPMPFLOW:
140                 final MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder
141                         = new MultipartRequestFlowCaseBuilder();
142                 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
143                 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
144                 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
145                 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
146                 multipartRequestFlowBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
147                 multipartRequestFlowBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
148
149                 switch (version) {
150                     case OFConstants.OFP_VERSION_1_0:
151                         MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
152                         multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
153                         break;
154                     case OFConstants.OFP_VERSION_1_3:
155                         multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
156                         break;
157                     default:
158                         throw new IllegalArgumentException("Unknown version " + version);
159                 }
160
161                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
162                 return multipartRequestFlowCaseBuilder.build();
163             case OFPMPAGGREGATE:
164                 return new MultipartRequestAggregateCaseBuilder().build();
165             case OFPMPTABLE:
166                 return new MultipartRequestTableCaseBuilder().build();
167             case OFPMPPORTSTATS:
168                 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder
169                         = new MultipartRequestPortStatsCaseBuilder();
170                 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder
171                         = new MultipartRequestPortStatsBuilder();
172                 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
173                 multipartRequestPortStatsCaseBuilder
174                         .setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
175                 return multipartRequestPortStatsCaseBuilder.build();
176             case OFPMPQUEUE:
177                 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder
178                         = new MultipartRequestQueueCaseBuilder();
179                 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
180                 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
181                 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
182                 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
183                 return multipartRequestQueueCaseBuilder.build();
184             case OFPMPGROUP:
185                 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder
186                         = new MultipartRequestGroupCaseBuilder();
187                 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
188                 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
189                 multipartRequestGroupBuilder.setGroupId(groupId);
190                 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
191                 return multipartRequestGroupCaseBuilder.build();
192             case OFPMPGROUPDESC:
193                 return new MultipartRequestGroupDescCaseBuilder().build();
194             case OFPMPGROUPFEATURES:
195                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
196             case OFPMPMETER:
197                 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder
198                         = new MultipartRequestMeterCaseBuilder();
199                 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
200                 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
201                 multipartRequestMeterBuilder.setMeterId(meterId);
202                 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
203                 return multipartRequestMeterCaseBuilder.build();
204             case OFPMPMETERCONFIG:
205                 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder
206                         = new MultipartRequestMeterConfigCaseBuilder();
207                 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder
208                         = new MultipartRequestMeterConfigBuilder();
209                 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
210                 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
211                 multipartRequestMeterConfigCaseBuilder
212                         .setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
213                 return multipartRequestMeterConfigCaseBuilder.build();
214             case OFPMPMETERFEATURES:
215                 return new MultipartRequestMeterFeaturesCaseBuilder().build();
216             case OFPMPTABLEFEATURES:
217                 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder
218                         = new MultipartRequestTableFeaturesCaseBuilder();
219                 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(
220                         new MultipartRequestTableFeaturesBuilder().build()
221                 );
222                 return tableFeaturesCaseBuilder.build();
223             case OFPMPPORTDESC:
224                 return new MultipartRequestPortDescCaseBuilder().build();
225             case OFPMPEXPERIMENTER:
226                 return new MultipartRequestExperimenterCaseBuilder().build();
227             default:
228                 throw new IllegalArgumentException("Unknown MultipartType " + type);
229         }
230     }
231 }