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.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Optional;
16 import javax.annotation.CheckForNull;
17 import org.opendaylight.openflowplugin.api.OFConstants;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
20 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.meters.Meter;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupFeatures;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupFeaturesBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.features.GroupFeaturesBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Chaining;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupCapability;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFf;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupSelect;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeatures;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.NodeMeterFeaturesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.MeterFeaturesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBand;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBurst;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterCapability;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterKbps;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterPktps;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterStats;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
63 * org.opendaylight.openflowplugin.impl.common
65 * @author <a href="mailto:vdemcak@cisco.com">Vaclav Demcak</a>
67 * Created: Mar 31, 2015
69 public class NodeStaticReplyTranslatorUtil {
71 private NodeStaticReplyTranslatorUtil() {
72 throw new UnsupportedOperationException("Utility class");
76 * Method transforms OFjava multipart reply model {@link MultipartReplyDesc} object
77 * to inventory data model {@link FlowCapableNode} object.
82 public static FlowCapableNode nodeDescTranslator(@CheckForNull final MultipartReplyDesc reply, final IpAddress ipAddress) {
83 Preconditions.checkArgument(reply != null);
84 final FlowCapableNodeBuilder flowCapAugBuilder = new FlowCapableNodeBuilder();
85 flowCapAugBuilder.setDescription(reply.getDpDesc());
86 flowCapAugBuilder.setHardware(reply.getHwDesc());
87 flowCapAugBuilder.setManufacturer(reply.getMfrDesc());
88 flowCapAugBuilder.setSoftware(reply.getSwDesc());
89 flowCapAugBuilder.setSerialNumber(reply.getSerialNum());
90 flowCapAugBuilder.setTable(Collections.<Table>emptyList());
91 flowCapAugBuilder.setMeter(Collections.<Meter>emptyList());
92 flowCapAugBuilder.setGroup(Collections.<Group>emptyList());
93 if (ipAddress != null) {
94 flowCapAugBuilder.setIpAddress(ipAddress);
96 return flowCapAugBuilder.build();
100 * Method transforms OFjava multipart reply model {@link MultipartReplyMeterFeatures} object
101 * to inventory data model {@link NodeMeterFeatures} object.
106 public static NodeMeterFeatures nodeMeterFeatureTranslator(@CheckForNull final MultipartReplyMeterFeatures reply) {
107 Preconditions.checkArgument(reply != null);
108 final MeterFeaturesBuilder meterFeature = new MeterFeaturesBuilder();
109 meterFeature.setMaxBands(reply.getMaxBands());
110 meterFeature.setMaxColor(reply.getMaxColor());
111 meterFeature.setMaxMeter(new Counter32(reply.getMaxMeter()));
112 final List<Class<? extends MeterBand>> meterBandTypes = new ArrayList<>();
113 if (reply.getBandTypes().isOFPMBTDROP()) {
114 meterBandTypes.add(MeterBandDrop.class);
116 if (reply.getBandTypes().isOFPMBTDSCPREMARK()) {
117 meterBandTypes.add(MeterBandDscpRemark.class);
119 meterFeature.setMeterBandSupported(Collections.unmodifiableList(meterBandTypes));
121 final List<java.lang.Class<? extends MeterCapability>> mCapability = new ArrayList<>();
122 if (reply.getCapabilities().isOFPMFBURST()) {
123 mCapability.add(MeterBurst.class);
125 if (reply.getCapabilities().isOFPMFKBPS()) {
126 mCapability.add(MeterKbps.class);
129 if (reply.getCapabilities().isOFPMFPKTPS()) {
130 mCapability.add(MeterPktps.class);
133 if (reply.getCapabilities().isOFPMFSTATS()) {
134 mCapability.add(MeterStats.class);
137 meterFeature.setMeterCapabilitiesSupported(Collections.unmodifiableList(mCapability));
138 return new NodeMeterFeaturesBuilder().setMeterFeatures(meterFeature.build()).build();
142 * Method transforms OFjava reply model {@link MultipartReplyGroupFeatures} object
143 * to inventory data model {@link NodeGroupFeatures} object.
148 public static NodeGroupFeatures nodeGroupFeatureTranslator(@CheckForNull final MultipartReplyGroupFeatures reply) {
149 Preconditions.checkArgument(reply != null);
150 final GroupFeaturesBuilder groupFeature = new GroupFeaturesBuilder();
151 groupFeature.setMaxGroups(reply.getMaxGroups());
153 final List<Class<? extends GroupType>> supportedGroups = new ArrayList<>();
154 addSupportedGroups(reply, supportedGroups);
155 groupFeature.setGroupTypesSupported(supportedGroups);
157 final List<Class<? extends GroupCapability>> gCapability = new ArrayList<>();
158 addGroupCapabilities(reply, gCapability);
159 groupFeature.setGroupCapabilitiesSupported(gCapability);
161 final List<Long> supportActionByGroups = new ArrayList<>();
162 for (final ActionType actionType : reply.getActionsBitmap()) {
163 long supportActionBitmap = 0;
164 supportActionBitmap |= actionType.isOFPATOUTPUT() ? (1 << 0) : 0;
165 supportActionBitmap |= actionType.isOFPATCOPYTTLOUT() ? (1 << 11) : 0;
166 supportActionBitmap |= actionType.isOFPATCOPYTTLIN() ? (1 << 12) : 0;
167 supportActionBitmap |= actionType.isOFPATSETMPLSTTL() ? (1 << 15) : 0;
168 supportActionBitmap |= actionType.isOFPATDECMPLSTTL() ? (1 << 16) : 0;
169 supportActionBitmap |= actionType.isOFPATPUSHVLAN() ? (1 << 17) : 0;
170 supportActionBitmap |= actionType.isOFPATPOPVLAN() ? (1 << 18) : 0;
171 supportActionBitmap |= actionType.isOFPATPUSHMPLS() ? (1 << 19) : 0;
172 supportActionBitmap |= actionType.isOFPATPOPMPLS() ? (1 << 20) : 0;
173 supportActionBitmap |= actionType.isOFPATSETQUEUE() ? (1 << 21) : 0;
174 supportActionBitmap |= actionType.isOFPATGROUP() ? (1 << 22) : 0;
175 supportActionBitmap |= actionType.isOFPATSETNWTTL() ? (1 << 23) : 0;
176 supportActionBitmap |= actionType.isOFPATDECNWTTL() ? (1 << 24) : 0;
177 supportActionBitmap |= actionType.isOFPATSETFIELD() ? (1 << 25) : 0;
178 supportActionBitmap |= actionType.isOFPATPUSHPBB() ? (1 << 26) : 0;
179 supportActionBitmap |= actionType.isOFPATPOPPBB() ? (1 << 27) : 0;
180 supportActionByGroups.add(Long.valueOf(supportActionBitmap));
182 groupFeature.setActions(supportActionByGroups);
183 return new NodeGroupFeaturesBuilder().setGroupFeatures(groupFeature.build()).build();
186 private static void addGroupCapabilities(final MultipartReplyGroupFeatures reply, final List<Class<? extends GroupCapability>> gCapability) {
187 if (reply.getCapabilities().isOFPGFCCHAINING()) {
188 gCapability.add(Chaining.class);
190 if (reply.getCapabilities().isOFPGFCCHAININGCHECKS()) {
191 gCapability.add(ChainingChecks.class);
193 if (reply.getCapabilities().isOFPGFCSELECTLIVENESS()) {
194 gCapability.add(SelectLiveness.class);
196 if (reply.getCapabilities().isOFPGFCSELECTWEIGHT()) {
197 gCapability.add(SelectWeight.class);
201 private static void addSupportedGroups(final MultipartReplyGroupFeatures reply, final List<Class<? extends GroupType>> supportedGroups) {
202 if (reply.getTypes().isOFPGTALL()) {
203 supportedGroups.add(GroupAll.class);
205 if (reply.getTypes().isOFPGTSELECT()) {
206 supportedGroups.add(GroupSelect.class);
208 if (reply.getTypes().isOFPGTINDIRECT()) {
209 supportedGroups.add(GroupIndirect.class);
211 if (reply.getTypes().isOFPGTFF()) {
212 supportedGroups.add(GroupFf.class);
217 * Method transform {@link MultipartReplyTableFeatures} to list of {@link TableFeatures}. Every
218 * table can have List of TableFeatures so add it directly to
219 * {@link org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder}
222 * @param version Openflow version
223 * @param convertorExecutor convertor executor
224 * @return list of table features
226 public static List<TableFeatures> nodeTableFeatureTranslator(@CheckForNull final MultipartReplyTableFeatures reply, final short version, @CheckForNull final ConvertorExecutor convertorExecutor) {
227 Preconditions.checkArgument(reply != null);
228 Preconditions.checkArgument(convertorExecutor != null);
229 final Optional<List<TableFeatures>> tableFeaturesList = convertorExecutor.convert(reply, new VersionConvertorData(version));
230 return tableFeaturesList.orElse(Collections.emptyList());
234 * Method build a ID Node Connector from version and port number.
241 public static NodeConnectorId nodeConnectorId(@CheckForNull final String datapathId, final long portNo, final short version) {
242 Preconditions.checkArgument(datapathId != null);
243 final String logicalName = OpenflowPortsUtil.getPortLogicalName(version, portNo);
244 return new NodeConnectorId(OFConstants.OF_URI_PREFIX + datapathId + ":" + (logicalName == null ? portNo : logicalName));