Change yang models due to errors
[openflowplugin.git] / extension / openflowplugin-extension-onf / src / main / java / org / opendaylight / openflowplugin / extension / onf / converter / BundleAddMessageConverter.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.extension.onf.converter;
10
11 import java.math.BigInteger;
12 import java.util.List;
13 import java.util.Optional;
14 import org.opendaylight.openflowplugin.api.OFConstants;
15 import org.opendaylight.openflowplugin.extension.api.ConverterMessageToOFJava;
16 import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
17 import org.opendaylight.openflowplugin.extension.onf.OnfConstants;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
21 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortMod;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.PortBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeContextRef;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.BundleInnerMessage;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddFlowCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleAddGroupCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveFlowCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleRemoveGroupCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdateFlowCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdateGroupCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.bundle.inner.message.grouping.bundle.inner.message.BundleUpdatePortCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.bundle.service.rev170124.send.experimenter.input.experimenter.message.of.choice.BundleAddMessageSal;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundleFlowModCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundleFlowModCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundleGroupModCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundleGroupModCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundlePortModCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.BundlePortModCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.bundle.flow.mod._case.FlowModCaseDataBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.bundle.group.mod._case.GroupModCaseDataBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.bundle.add.message.grouping.bundle.inner.message.bundle.port.mod._case.PortModCaseDataBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleAddMessageOnf;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.BundleAddMessageOnfBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.onf.rev170124.experimenter.input.experimenter.data.of.choice.bundle.add.message.onf.OnfAddMessageGroupingDataBuilder;
59
60 /**
61  * Converter for BundleAddMessage messages (ONF approved extension #230).
62  */
63 public class BundleAddMessageConverter implements ConverterMessageToOFJava<BundleAddMessageSal, BundleAddMessageOnf> {
64
65     private static final ConvertorExecutor converterExecutor = ConvertorManagerFactory.createDefaultManager();
66     private static final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(OFConstants.OFP_VERSION_1_3);
67
68     @Override
69     public BundleAddMessageOnf convert(BundleAddMessageSal experimenterMessageCase) throws ConversionException {
70         final OnfAddMessageGroupingDataBuilder dataBuilder = new OnfAddMessageGroupingDataBuilder();
71         dataBuilder.setBundleId(experimenterMessageCase.getSalAddMessageData().getBundleId());
72         dataBuilder.setFlags(experimenterMessageCase.getSalAddMessageData().getFlags());
73         dataBuilder.setBundleProperty(experimenterMessageCase.getSalAddMessageData().getBundleProperty());
74         final BundleInnerMessage innerMessage = experimenterMessageCase.getSalAddMessageData().getBundleInnerMessage();
75         data.setDatapathId(digDatapathId((NodeContextRef)innerMessage));
76
77         if (innerMessage instanceof Flow) {
78             dataBuilder.setBundleInnerMessage(convertBundleFlowCase(innerMessage));
79         } else if (innerMessage instanceof Group) {
80             dataBuilder.setBundleInnerMessage(convertBundleGroupCase(innerMessage));
81         } else if (innerMessage instanceof PortMod) {
82             dataBuilder.setBundleInnerMessage(convertBundlePortCase(innerMessage));
83         } else {
84             throw new ConversionException("Unsupported inner message");
85         }
86
87         return new BundleAddMessageOnfBuilder().setOnfAddMessageGroupingData(dataBuilder.build()).build();
88     }
89
90     private BundleFlowModCase convertBundleFlowCase(final BundleInnerMessage messageCase) throws ConversionException {
91         Optional<List<FlowModInputBuilder>> flowModInputs = Optional.empty();
92         final Class clazz = messageCase.getImplementedInterface();
93         if (clazz.equals(BundleAddFlowCase.class)) {
94             flowModInputs = converterExecutor.convert(new AddFlowInputBuilder((Flow)messageCase).build(), data);
95         } else if (clazz.equals(BundleUpdateFlowCase.class)) {
96             flowModInputs = converterExecutor.convert(new UpdatedFlowBuilder((Flow)messageCase).build(), data);
97         } else if (clazz.equals(BundleRemoveFlowCase.class)) {
98             flowModInputs = converterExecutor.convert(new RemoveFlowInputBuilder((Flow)messageCase).build(), data);
99         }
100
101         if (flowModInputs.isPresent()) {
102             if (flowModInputs.get().size() == 1) {
103                 return new BundleFlowModCaseBuilder()
104                         .setFlowModCaseData(
105                                 new FlowModCaseDataBuilder(
106                                         flowModInputs
107                                                 .get()
108                                                 .get(0)
109                                                 .build())
110                                         .build())
111                         .build();
112             } else {
113                 throw new ConversionException("BundleFlowCase conversion unsuccessful - not able to convert to multiple flows.");
114             }
115         } else {
116             throw new ConversionException("BundleFlowCase conversion unsuccessful.");
117         }
118     }
119
120     private BundleGroupModCase convertBundleGroupCase(final BundleInnerMessage messageCase) throws ConversionException {
121         Optional<GroupModInputBuilder> groupModInput = Optional.empty();
122         final Class clazz = messageCase.getImplementedInterface();
123         if (clazz.equals(BundleAddGroupCase.class)) {
124             groupModInput = converterExecutor.convert(new AddGroupInputBuilder((Group)messageCase).build(), data);
125         } else if (clazz.equals(BundleUpdateGroupCase.class)) {
126             groupModInput = converterExecutor.convert(new UpdatedGroupBuilder((Group)messageCase).build(), data);
127         } else if (clazz.equals(BundleRemoveGroupCase.class)) {
128             groupModInput = converterExecutor.convert(new RemoveGroupInputBuilder((Group)messageCase).build(), data);
129         }
130
131         if (groupModInput.isPresent()) {
132             return new BundleGroupModCaseBuilder()
133                     .setGroupModCaseData(
134                             new GroupModCaseDataBuilder(groupModInput.get().build())
135                             .build()
136                     )
137                     .build();
138         } else {
139             throw new ConversionException("BundleGroupCase conversion unsuccessful.");
140         }
141     }
142
143     private BundlePortModCase convertBundlePortCase(final BundleInnerMessage messageCase) throws ConversionException {
144         Optional<PortModInput> portModInput = Optional.empty();
145         final Class clazz = messageCase.getImplementedInterface();
146         if (clazz.equals(BundleUpdatePortCase.class)) {
147             portModInput = converterExecutor.convert(new PortBuilder(((PortMod)messageCase).getPort().getPort().get(0)).build(), data);
148         }
149
150         if (portModInput.isPresent()) {
151             return new BundlePortModCaseBuilder()
152                     .setPortModCaseData(
153                             new PortModCaseDataBuilder(portModInput.get())
154                             .build()
155                     )
156                     .build();
157         } else {
158             throw new ConversionException("BundlePortCase conversion unsuccessful.");
159         }
160     }
161
162     private static BigInteger digDatapathId(final NodeContextRef ref) {
163         return InventoryDataServiceUtil.dataPathIdFromNodeId(ref.getNode().getValue().firstKeyOf(Node.class).getId());
164     }
165
166     @Override
167     public ExperimenterId getExperimenterId() {
168         return new ExperimenterId(OnfConstants.ONF_EXPERIMENTER_ID);
169     }
170
171     @Override
172     public long getType() {
173         return OnfConstants.ONF_ET_BUNDLE_ADD_MESSAGE;
174     }
175
176 }