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 com.google.common.base.Preconditions;
12 import java.math.BigInteger;
13 import javax.annotation.CheckForNull;
14 import javax.annotation.Nonnull;
15 import org.opendaylight.openflowplugin.api.OFConstants;
16 import org.opendaylight.openflowplugin.impl.util.MatchUtil;
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.oxm.rev150225.match.v10.grouping.MatchV10Builder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
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.MultipartRequestDescCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
52 * org.opendaylight.openflowplugin.impl.common
54 * Factory class is designed for easy producing a MultipartRequestInput. Class should help
55 * to understand a relationship between {@link MultipartType} and {@link MultipartRequestInput}
56 * without touch OF specification 1.3.2 - a section 7.3.5. Multipart Messages
57 * 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>
59 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
61 * Created: Mar 27, 2015
63 public final class MultipartRequestInputFactory {
65 private MultipartRequestInputFactory() {
66 throw new UnsupportedOperationException("Factory class");
70 * Method validate input and makes {@link MultipartRequestInput} from input values. Method set
71 * a moreRequest marker to false and it creates default empty {@link MultipartRequestBody}
72 * by {@link MultipartType}
79 public static MultipartRequestInput makeMultipartRequestInput(final long xid, final short ofVersion,
80 @Nonnull final MultipartType type) {
81 return maker(xid, type, ofVersion, false, makeDefaultEmptyRequestBody(type, ofVersion));
87 * Method build {@link MultipartRequestInput} from input values. It is private because we would like
88 * to validate only what is really need to be validate.
97 private static MultipartRequestInput maker(final long xid, final MultipartType type,
98 final short ofVersion, final boolean moreRequests, final MultipartRequestBody body) {
99 final MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
100 builder.setFlags(new MultipartRequestFlags(moreRequests));
101 builder.setMultipartRequestBody(body);
102 builder.setVersion(ofVersion);
103 builder.setType(type);
105 return builder.build();
108 private static MultipartRequestBody makeDefaultEmptyRequestBody(@CheckForNull final MultipartType type, @CheckForNull final short version) {
109 Preconditions.checkArgument(type != null, "Multipart Request can not by build without type!");
112 return new MultipartRequestDescCaseBuilder().build();
114 MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
115 MultipartRequestFlowBuilder multipartRequestFlowBuilder = new MultipartRequestFlowBuilder();
116 multipartRequestFlowBuilder.setTableId(OFConstants.OFPTT_ALL);
117 multipartRequestFlowBuilder.setOutPort(OFConstants.OFPP_ANY);
118 multipartRequestFlowBuilder.setOutGroup(OFConstants.OFPG_ANY);
119 multipartRequestFlowBuilder.setCookie(BigInteger.ZERO);
120 multipartRequestFlowBuilder.setCookieMask(BigInteger.ZERO);
122 case OFConstants.OFP_VERSION_1_0:
123 MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
124 multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
126 case OFConstants.OFP_VERSION_1_3:
127 multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
130 throw new IllegalArgumentException("Unknown version " + version);
132 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
133 return multipartRequestFlowCaseBuilder.build();
135 return new MultipartRequestAggregateCaseBuilder().build();
137 return new MultipartRequestTableCaseBuilder().build();
139 MultipartRequestPortStatsCaseBuilder multipartRequestPortStatsCaseBuilder = new MultipartRequestPortStatsCaseBuilder();
140 MultipartRequestPortStatsBuilder multipartRequestPortStatsBuilder = new MultipartRequestPortStatsBuilder();
141 multipartRequestPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
142 multipartRequestPortStatsCaseBuilder.setMultipartRequestPortStats(multipartRequestPortStatsBuilder.build());
143 return multipartRequestPortStatsCaseBuilder.build();
145 MultipartRequestQueueCaseBuilder multipartRequestQueueCaseBuilder = new MultipartRequestQueueCaseBuilder();
146 MultipartRequestQueueBuilder multipartRequestQueueBuilder = new MultipartRequestQueueBuilder();
147 multipartRequestQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
148 multipartRequestQueueBuilder.setQueueId(OFConstants.OFPQ_ALL);
149 multipartRequestQueueCaseBuilder.setMultipartRequestQueue(multipartRequestQueueBuilder.build());
150 return multipartRequestQueueCaseBuilder.build();
152 MultipartRequestGroupCaseBuilder multipartRequestGroupCaseBuilder = new MultipartRequestGroupCaseBuilder();
153 MultipartRequestGroupBuilder multipartRequestGroupBuilder = new MultipartRequestGroupBuilder();
154 GroupId groupId = new GroupId(OFConstants.OFPG_ALL);
155 multipartRequestGroupBuilder.setGroupId(groupId);
156 multipartRequestGroupCaseBuilder.setMultipartRequestGroup(multipartRequestGroupBuilder.build());
157 return multipartRequestGroupCaseBuilder.build();
159 return new MultipartRequestGroupDescCaseBuilder().build();
160 case OFPMPGROUPFEATURES:
161 return new MultipartRequestGroupFeaturesCaseBuilder().build();
163 MultipartRequestMeterCaseBuilder multipartRequestMeterCaseBuilder = new MultipartRequestMeterCaseBuilder();
164 MultipartRequestMeterBuilder multipartRequestMeterBuilder = new MultipartRequestMeterBuilder();
165 MeterId meterId = new MeterId(OFConstants.OFPM_ALL);
166 multipartRequestMeterBuilder.setMeterId(meterId);
167 multipartRequestMeterCaseBuilder.setMultipartRequestMeter(multipartRequestMeterBuilder.build());
168 return multipartRequestMeterCaseBuilder.build();
169 case OFPMPMETERCONFIG:
170 MultipartRequestMeterConfigCaseBuilder multipartRequestMeterConfigCaseBuilder = new MultipartRequestMeterConfigCaseBuilder();
171 MultipartRequestMeterConfigBuilder multipartRequestMeterConfigBuilder = new MultipartRequestMeterConfigBuilder();
172 MeterId configMeterId = new MeterId(OFConstants.OFPM_ALL);
173 multipartRequestMeterConfigBuilder.setMeterId(configMeterId);
174 multipartRequestMeterConfigCaseBuilder.setMultipartRequestMeterConfig(multipartRequestMeterConfigBuilder.build());
175 return multipartRequestMeterConfigCaseBuilder.build();
176 case OFPMPMETERFEATURES:
177 return new MultipartRequestMeterFeaturesCaseBuilder().build();
178 case OFPMPTABLEFEATURES:
179 MultipartRequestTableFeaturesCaseBuilder tableFeaturesCaseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
180 tableFeaturesCaseBuilder.setMultipartRequestTableFeatures(new MultipartRequestTableFeaturesBuilder().build());
181 return tableFeaturesCaseBuilder.build();
183 return new MultipartRequestPortDescCaseBuilder().build();
184 case OFPMPEXPERIMENTER:
185 return new MultipartRequestExperimenterCaseBuilder().build();
187 throw new IllegalArgumentException("Unknown MultipartType " + type);