2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.common;
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.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestGroupStatsBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body.MultipartRequestMeterStatsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartRequestBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10Builder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
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.MultipartRequestPortDescCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.request.multipart.request.body.MultipartRequestQueueStatsBuilder;
63 * 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 * see also <a href="https://www.opennetworking.org/images/stories/downloads/sdn-resources/onf-specifications/openflow/openflow-spec-v1.3.2.pdf">OpenFlow 1.3.2</a>
70 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
72 * Created: Mar 27, 2015
74 public final class MultipartRequestInputFactory {
76 private MultipartRequestInputFactory() {
77 throw new UnsupportedOperationException("Factory class");
81 * Method validate input and makes {@link org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader}
82 * from input values. Method set a moreRequest marker to false and it creates default empty multipart request body
83 * by {@link MultipartType}
86 * @param version OpenFlow version
87 * @param type multipart type
88 * @param canUseSingleLayer can use single layer serialization
89 * @return multipart request
91 public static OfHeader makeMultipartRequest(final long xid,
93 @Nonnull final MultipartType type,
94 final boolean canUseSingleLayer) {
95 return canUseSingleLayer ?
96 new MultipartRequestBuilder()
97 .setRequestMore(false)
100 .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
102 new MultipartRequestInputBuilder()
103 .setFlags(new MultipartRequestFlags(false))
104 .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
111 private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
112 .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
114 case OFPMPDESC: return new MultipartRequestDescBuilder().build();
115 case OFPMPFLOW: return new MultipartRequestFlowStatsBuilder()
116 .setMatch(new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow
117 .MatchBuilder().build())
119 case OFPMPAGGREGATE: return new MultipartRequestFlowAggregateStatsBuilder().build();
120 case OFPMPTABLE: return new MultipartRequestFlowTableStatsBuilder().build();
121 case OFPMPPORTSTATS: return new org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.request.multipart.request.body
122 .MultipartRequestPortStatsBuilder().build();
123 case OFPMPQUEUE: return new MultipartRequestQueueStatsBuilder().build();
124 case OFPMPGROUP: return new MultipartRequestGroupStatsBuilder().build();
125 case OFPMPGROUPDESC: return new MultipartRequestGroupDescBuilder().build();
126 case OFPMPGROUPFEATURES: return new MultipartRequestGroupFeaturesBuilder().build();
127 case OFPMPMETER: return new MultipartRequestMeterStatsBuilder().build();
128 case OFPMPMETERCONFIG: return new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.request.multipart.request.body
129 .MultipartRequestMeterConfigBuilder().build();
130 case OFPMPMETERFEATURES: return new MultipartRequestMeterFeaturesBuilder().build();
131 case OFPMPTABLEFEATURES: return new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.request.multipart.request.body
132 .MultipartRequestTableFeaturesBuilder().build();
133 case OFPMPPORTDESC: return new MultipartRequestPortDescBuilder().build();
134 case OFPMPEXPERIMENTER: return new MultipartRequestExperimenterBuilder().build();
135 default:throw new IllegalArgumentException("Unknown MultipartType " + type);
139 private static MultipartRequestBody makeDefaultMultiLayerBody(@Nonnull final MultipartType type,
140 final short version) {
143 return new MultipartRequestDescCaseBuilder().build();
145 MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
146 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
147 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
148 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
149 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
150 multipartRequestFlowBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
151 multipartRequestFlowBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
154 case OFConstants.OFP_VERSION_1_0:
155 MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
156 multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
158 case OFConstants.OFP_VERSION_1_3:
159 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
162 throw new IllegalArgumentException("Unknown version " + version);
165 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
166 return multipartRequestFlowCaseBuilder.build();
168 return new MultipartRequestAggregateCaseBuilder().build();
170 return new MultipartRequestTableCaseBuilder().build();
172 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
173 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
174 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
175 multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
176 return multipartRequestPortStatsCaseBuilder.build();
178 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = 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();
185 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
186 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
187 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
188 multipartRequestGroupBuilder.setGroupId(groupId);
189 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
190 return multipartRequestGroupCaseBuilder.build();
192 return new MultipartRequestGroupDescCaseBuilder().build();
193 case OFPMPGROUPFEATURES:
194 return new MultipartRequestGroupFeaturesCaseBuilder().build();
196 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
197 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
198 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
199 multipartRequestMeterBuilder.setMeterId(meterId);
200 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
201 return multipartRequestMeterCaseBuilder.build();
202 case OFPMPMETERCONFIG:
203 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder = new MultipartRequestMeterConfigCaseBuilder();
204 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder = new MultipartRequestMeterConfigBuilder();
205 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
206 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
207 multipartRequestMeterConfigCaseBuilder.setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
208 return multipartRequestMeterConfigCaseBuilder.build();
209 case OFPMPMETERFEATURES:
210 return new MultipartRequestMeterFeaturesCaseBuilder().build();
211 case OFPMPTABLEFEATURES:
212 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
213 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
214 return tableFeaturesCaseBuilder.build();
216 return new MultipartRequestPortDescCaseBuilder().build();
217 case OFPMPEXPERIMENTER:
218 return new MultipartRequestExperimenterCaseBuilder().build();
220 throw new IllegalArgumentException("Unknown MultipartType " + type);