Bug:701 - Have Typed ErrorNotification for different node errrors
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / translator / ErrorTranslator.java
1 /**
2  * Copyright (c) 2013 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 package org.opendaylight.openflowplugin.openflow.md.core.translator;
9
10 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
11 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
12 import org.opendaylight.openflowplugin.openflow.md.core.session.TransactionKey;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorType;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotificationBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.ObjectReference;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.FlowRefBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.GroupRefBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.MeterRefBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionMetadata;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.NodeGroup;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.NodeMeter;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadActionErrorNotificationBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadInstructionErrorNotification;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadInstructionErrorNotificationBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadMatchErrorNotificationBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadRequestErrorNotificationBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.ExperimenterErrorNotificationBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.FlowModErrorNotification;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.FlowModErrorNotificationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.GroupModErrorNotificationBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.HelloFailedErrorNotificationBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.MeterModErrorNotificationBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.PortModErrorNotificationBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.QueueOpErrorNotificationBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.RoleRequestErrorNotificationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.SwitchConfigErrorNotification;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.SwitchConfigErrorNotificationBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.TableFeaturesErrorNotificationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
44 import org.opendaylight.yangtools.yang.binding.DataObject;
45
46 import java.math.BigInteger;
47 import java.util.List;
48 import java.util.concurrent.CopyOnWriteArrayList;
49
50 public class ErrorTranslator extends AbstractErrorTranslator {
51
52     @Override
53     public ErrorType decodeErrorType(int type) {
54         return ErrorType.forValue(type);
55     }
56
57     @Override
58     public List<DataObject> getGranularNodeErrors(ErrorMessage message, ErrorType errorType, Uri uri, ObjectReference objRef){
59         List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
60         TransactionId txnId = new TransactionId(BigInteger.valueOf(message.getXid()));
61
62         //currently in yang , generation of builders does not support an interface
63         //so each notification is put in a separate if-else
64         if (errorType == ErrorType.HelloFailed) {
65             HelloFailedErrorNotificationBuilder builder = new HelloFailedErrorNotificationBuilder();
66             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
67             builder.setType(errorType);
68             builder.setCode(message.getCode());
69             if (message.getData() != null) {
70                 builder.setData(new String(message.getData()));
71             }
72             builder.setTransactionUri(uri);
73             builder.setObjectReference(objRef);
74             list.add(builder.build());
75
76         } else if (errorType == ErrorType.BadRequest) {
77             BadRequestErrorNotificationBuilder builder = new BadRequestErrorNotificationBuilder ();
78             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
79             builder.setType(errorType);
80             builder.setCode(message.getCode());
81             if (message.getData() != null) {
82                 builder.setData(new String(message.getData()));
83             }
84             builder.setTransactionUri(uri);
85             builder.setObjectReference(objRef);
86             list.add(builder.build());
87         } else if (errorType == ErrorType.BadAction) {
88             BadActionErrorNotificationBuilder builder = new BadActionErrorNotificationBuilder();
89             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
90             builder.setType(errorType);
91             builder.setCode(message.getCode());
92             if (message.getData() != null) {
93                 builder.setData(new String(message.getData()));
94             }
95             builder.setTransactionUri(uri);
96             builder.setObjectReference(objRef);
97             list.add(builder.build());
98         } else if (errorType == ErrorType.BadInstruction) {
99             BadInstructionErrorNotificationBuilder builder = new BadInstructionErrorNotificationBuilder();
100             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
101             builder.setType(errorType);
102             builder.setCode(message.getCode());
103             if (message.getData() != null) {
104                 builder.setData(new String(message.getData()));
105             }
106             builder.setTransactionUri(uri);
107             builder.setObjectReference(objRef);
108             list.add(builder.build());
109
110         } else if (errorType == ErrorType.BadMatch) {
111             BadMatchErrorNotificationBuilder builder = new BadMatchErrorNotificationBuilder();
112             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
113             builder.setType(errorType);
114             builder.setCode(message.getCode());
115             if (message.getData() != null) {
116                 builder.setData(new String(message.getData()));
117             }
118             builder.setTransactionUri(uri);
119             builder.setObjectReference(objRef);
120             list.add(builder.build());
121         } else if (errorType == ErrorType.FlowModFailed) {
122             FlowModErrorNotificationBuilder builder = new FlowModErrorNotificationBuilder();
123             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
124             builder.setType(errorType);
125             builder.setCode(message.getCode());
126             if (message.getData() != null) {
127                 builder.setData(new String(message.getData()));
128             }
129             builder.setTransactionUri(uri);
130             builder.setObjectReference(objRef);
131             list.add(builder.build());
132         } else if (errorType == ErrorType.GroupModFailed) {
133             GroupModErrorNotificationBuilder builder = new GroupModErrorNotificationBuilder();
134             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
135             builder.setType(errorType);
136             builder.setCode(message.getCode());
137             if (message.getData() != null) {
138                 builder.setData(new String(message.getData()));
139             }
140             builder.setTransactionUri(uri);
141             builder.setObjectReference(objRef);
142             list.add(builder.build());
143         } else if (errorType == ErrorType.PortModFailed) {
144             PortModErrorNotificationBuilder builder = new PortModErrorNotificationBuilder();
145             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
146             builder.setType(errorType);
147             builder.setCode(message.getCode());
148             if (message.getData() != null) {
149                 builder.setData(new String(message.getData()));
150             }
151             builder.setTransactionUri(uri);
152             builder.setObjectReference(objRef);
153             list.add(builder.build());
154         } else if (errorType == ErrorType.QueueOpFailed) {
155             QueueOpErrorNotificationBuilder builder = new QueueOpErrorNotificationBuilder();
156             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
157             builder.setType(errorType);
158             builder.setCode(message.getCode());
159             if (message.getData() != null) {
160                 builder.setData(new String(message.getData()));
161             }
162             builder.setTransactionUri(uri);
163             builder.setObjectReference(objRef);
164             list.add(builder.build());
165         } else if (errorType == ErrorType.SwitchConfigFailed) {
166             SwitchConfigErrorNotificationBuilder builder = new SwitchConfigErrorNotificationBuilder();
167             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
168             builder.setType(errorType);
169             builder.setCode(message.getCode());
170             if (message.getData() != null) {
171                 builder.setData(new String(message.getData()));
172             }
173             builder.setTransactionUri(uri);
174             builder.setObjectReference(objRef);
175             list.add(builder.build());
176         } else if (errorType == ErrorType.RoleRequestFailed) {
177             RoleRequestErrorNotificationBuilder builder = new RoleRequestErrorNotificationBuilder();
178             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
179             builder.setType(errorType);
180             builder.setCode(message.getCode());
181             if (message.getData() != null) {
182                 builder.setData(new String(message.getData()));
183             }
184             builder.setTransactionUri(uri);
185             builder.setObjectReference(objRef);
186             list.add(builder.build());
187         } else if (errorType == ErrorType.MeterModFailed) {
188             MeterModErrorNotificationBuilder builder = new MeterModErrorNotificationBuilder();
189             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
190             builder.setType(errorType);
191             builder.setCode(message.getCode());
192             if (message.getData() != null) {
193                 builder.setData(new String(message.getData()));
194             }
195             builder.setTransactionUri(uri);
196             builder.setObjectReference(objRef);
197             list.add(builder.build());
198         } else if (errorType == ErrorType.TableFeaturesFailed) {
199             TableFeaturesErrorNotificationBuilder builder = new TableFeaturesErrorNotificationBuilder();
200             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
201             builder.setType(errorType);
202             builder.setCode(message.getCode());
203             if (message.getData() != null) {
204                 builder.setData(new String(message.getData()));
205             }
206             builder.setTransactionUri(uri);
207             builder.setObjectReference(objRef);
208             list.add(builder.build());
209         } else if (errorType == ErrorType.Experimenter) {
210             ExperimenterErrorNotificationBuilder builder = new ExperimenterErrorNotificationBuilder();
211             builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
212             builder.setType(errorType);
213             builder.setCode(message.getCode());
214             if (message.getData() != null) {
215                 builder.setData(new String(message.getData()));
216             }
217             builder.setTransactionUri(uri);
218             builder.setObjectReference(objRef);
219             list.add(builder.build());
220         }
221         return list;
222     }
223
224 }