Merge "Remove logback related stuff"
[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.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;
60
61 /**
62  * openflowplugin-impl
63  * org.opendaylight.openflowplugin.impl.common
64  * <p>
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>
69  *
70  * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
71  *         <p>
72  *         Created: Mar 27, 2015
73  */
74 public final class MultipartRequestInputFactory {
75
76     private MultipartRequestInputFactory() {
77         throw new UnsupportedOperationException("Factory class");
78     }
79
80     /**
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}
84      *
85      * @param xid xid
86      * @param version OpenFlow version
87      * @param type multipart type
88      * @param canUseSingleLayer can use single layer serialization
89      * @return multipart request
90      */
91     public static OfHeader makeMultipartRequest(final long xid,
92                                                 final short version,
93                                                 @Nonnull final MultipartType type,
94                                                 final boolean canUseSingleLayer) {
95         return canUseSingleLayer ?
96             new MultipartRequestBuilder()
97                 .setRequestMore(false)
98                 .setVersion(version)
99                 .setXid(xid)
100                 .setMultipartRequestBody(makeDefaultSingleLayerBody(type))
101                 .build() :
102             new MultipartRequestInputBuilder()
103                 .setFlags(new MultipartRequestFlags(false))
104                 .setMultipartRequestBody(makeDefaultMultiLayerBody(type, version))
105                 .setVersion(version)
106                 .setType(type)
107                 .setXid(xid)
108                 .build();
109     }
110
111     private static org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request
112         .MultipartRequestBody makeDefaultSingleLayerBody(final MultipartType type) {
113         switch (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())
118                 .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);
136         }
137     }
138
139     private static MultipartRequestBody makeDefaultMultiLayerBody(@Nonnull final MultipartType type,
140                                                                   final short version) {
141         switch (type) {
142             case OFPMPDESC:
143                 return new MultipartRequestDescCaseBuilder().build();
144             case OFPMPFLOW:
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);
152
153                 switch (version) {
154                     case OFConstants.OFP_VERSION_1_0:
155                         MatchV10Builder matchV10Builder = MatchUtil.createEmptyV10Match();
156                         multipartRequestFlowBuilder.setMatchV10(matchV10Builder.build());
157                         break;
158                     case OFConstants.OFP_VERSION_1_3:
159                         multipartRequestFlowBuilder.setMatch(new MatchBuilder().setType(OxmMatchType.class).build());
160                         break;
161                     default:
162                         throw new IllegalArgumentException("Unknown version " + version);
163                 }
164
165                 multipartRequestFlowCaseBuilder.setMultipartRequestFlow(multipartRequestFlowBuilder.build());
166                 return multipartRequestFlowCaseBuilder.build();
167             case OFPMPAGGREGATE:
168                 return new MultipartRequestAggregateCaseBuilder().build();
169             case OFPMPTABLE:
170                 return new MultipartRequestTableCaseBuilder().build();
171             case OFPMPPORTSTATS:
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();
177             case OFPMPQUEUE:
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();
184             case OFPMPGROUP:
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();
191             case OFPMPGROUPDESC:
192                 return new MultipartRequestGroupDescCaseBuilder().build();
193             case OFPMPGROUPFEATURES:
194                 return new MultipartRequestGroupFeaturesCaseBuilder().build();
195             case OFPMPMETER:
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();
215             case OFPMPPORTDESC:
216                 return new MultipartRequestPortDescCaseBuilder().build();
217             case OFPMPEXPERIMENTER:
218                 return new MultipartRequestExperimenterCaseBuilder().build();
219             default:
220                 throw new IllegalArgumentException("Unknown MultipartType " + type);
221         }
222     }
223 }