Merge "Bug 6193 - Change in length of DatapathId of a switch"
[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.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;
49
50 /**
51  * openflowplugin-impl
52  * org.opendaylight.openflowplugin.impl.common
53  * <p>
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>
58  *
59  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
60  *         <p>
61  *         Created: Mar 27, 2015
62  */
63 public final class MultipartRequestInputFactory {
64
65     private MultipartRequestInputFactory() {
66         throw new UnsupportedOperationException("Factory class");
67     }
68
69     /**
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}
73      *
74      * @param xid
75      * @param type
76      * @param ofVersion
77      * @return
78      */
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));
82     }
83
84
85
86     /**
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.
89      *
90      * @param xid
91      * @param type
92      * @param ofVersion
93      * @param moreRequests
94      * @param body
95      * @return
96      */
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);
104         builder.setXid(xid);
105         return builder.build();
106     }
107
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!");
110         switch (type) {
111             case OFPMPDESC:
112                 return new MultipartRequestDescCaseBuilder().build();
113             case OFPMPFLOW:
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);
121                 switch (version) {
122                     case OFConstants.OFP_VERSION_1_0:
123                         MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
124                         multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
125                         break;
126                     case OFConstants.OFP_VERSION_1_3:
127                         multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
128                         break;
129                     default:
130                         throw new IllegalArgumentException("Unknown version " + version);
131                 }
132                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
133                 return multipartRequestFlowCaseBuilder.build();
134             case OFPMPAGGREGATE:
135                 return new MultipartRequestAggregateCaseBuilder().build();
136             case OFPMPTABLE:
137                 return new MultipartRequestTableCaseBuilder().build();
138             case OFPMPPORTSTATS:
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();
144             case OFPMPQUEUE:
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();
151             case OFPMPGROUP:
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();
158             case OFPMPGROUPDESC:
159                 return new MultipartRequestGroupDescCaseBuilder().build();
160             case OFPMPGROUPFEATURES:
161                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
162             case OFPMPMETER:
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();
182             case OFPMPPORTDESC:
183                 return new MultipartRequestPortDescCaseBuilder().build();
184             case OFPMPEXPERIMENTER:
185                 return new MultipartRequestExperimenterCaseBuilder().build();
186             default:
187                 throw new IllegalArgumentException("Unknown MultipartType " + type);
188         }
189     }
190 }