Bug:701 - Have Typed ErrorNotification for different node errrors
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / translator / ErrorTranslator.java
index f515efb001e67b52f3048a78b36828b2126f5136..8a69da891c4255e03a9ddd813bdcdef2111ee7f7 100644 (file)
  */
 package org.opendaylight.openflowplugin.openflow.md.core.translator;
 
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
-import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.session.TransactionKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.ObjectReference;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.FlowRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.GroupRefBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.reference.object.reference.MeterRefBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionMetadata;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.NodeGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.NodeMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadActionErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadInstructionErrorNotification;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadInstructionErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadMatchErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.BadRequestErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.ExperimenterErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.FlowModErrorNotification;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.FlowModErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.GroupModErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.HelloFailedErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.MeterModErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.PortModErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.QueueOpErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.RoleRequestErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.SwitchConfigErrorNotification;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.SwitchConfigErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.TableFeaturesErrorNotificationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class ErrorTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
+import java.math.BigInteger;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 
-    protected static final Logger LOG = LoggerFactory.getLogger(ErrorTranslator.class);
+public class ErrorTranslator extends AbstractErrorTranslator {
 
     @Override
-    public List<DataObject> translate(SwitchConnectionDistinguisher cookie, SessionContext sc, OfHeader msg) {
-        if (msg instanceof ErrorMessage) {
-            ErrorMessage message = (ErrorMessage) msg;
-            List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
-            LOG.error(" Error Message received: type={}[{}], code={}[{}], data=[{}] ", message.getType(),
-                    message.getTypeString(), message.getCode(), message.getCodeString(),
-                    ByteUtil.bytesToHexstring(message.getData(), " "));
-
-            // create a Node Error Notification event builder
-            NodeErrorNotificationBuilder nodeErrBuilder = new NodeErrorNotificationBuilder();
-
-            // Fill in the Node Error Notification Builder object from the Error
-            // Message
-
-            nodeErrBuilder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
-
-            nodeErrBuilder.setType(ErrorType.forValue(message.getType()));
-
-            nodeErrBuilder.setCode(message.getCode());
+    public ErrorType decodeErrorType(int type) {
+        return ErrorType.forValue(type);
+    }
 
-            nodeErrBuilder.setData(new String(message.getData()));
+    @Override
+    public List<DataObject> getGranularNodeErrors(ErrorMessage message, ErrorType errorType, Uri uri, ObjectReference objRef){
+        List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
+        TransactionId txnId = new TransactionId(BigInteger.valueOf(message.getXid()));
 
-            // TODO -- Augmentation is not handled
+        //currently in yang , generation of builders does not support an interface
+        //so each notification is put in a separate if-else
+        if (errorType == ErrorType.HelloFailed) {
+            HelloFailedErrorNotificationBuilder builder = new HelloFailedErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
 
-            // Note Error_TypeV10 is not handled.
+        } else if (errorType == ErrorType.BadRequest) {
+            BadRequestErrorNotificationBuilder builder = new BadRequestErrorNotificationBuilder ();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.BadAction) {
+            BadActionErrorNotificationBuilder builder = new BadActionErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.BadInstruction) {
+            BadInstructionErrorNotificationBuilder builder = new BadInstructionErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
 
-            NodeErrorNotification nodeErrorEvent = nodeErrBuilder.build();
-            list.add(nodeErrorEvent);
-            return list;
-        } else {
-            LOG.error("Message is not of Error Message ");
-            return Collections.emptyList();
+        } else if (errorType == ErrorType.BadMatch) {
+            BadMatchErrorNotificationBuilder builder = new BadMatchErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.FlowModFailed) {
+            FlowModErrorNotificationBuilder builder = new FlowModErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.GroupModFailed) {
+            GroupModErrorNotificationBuilder builder = new GroupModErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.PortModFailed) {
+            PortModErrorNotificationBuilder builder = new PortModErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.QueueOpFailed) {
+            QueueOpErrorNotificationBuilder builder = new QueueOpErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.SwitchConfigFailed) {
+            SwitchConfigErrorNotificationBuilder builder = new SwitchConfigErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.RoleRequestFailed) {
+            RoleRequestErrorNotificationBuilder builder = new RoleRequestErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.MeterModFailed) {
+            MeterModErrorNotificationBuilder builder = new MeterModErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.TableFeaturesFailed) {
+            TableFeaturesErrorNotificationBuilder builder = new TableFeaturesErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
+        } else if (errorType == ErrorType.Experimenter) {
+            ExperimenterErrorNotificationBuilder builder = new ExperimenterErrorNotificationBuilder();
+            builder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            builder.setTransactionUri(uri);
+            builder.setObjectReference(objRef);
+            list.add(builder.build());
         }
+        return list;
     }
 
 }