External api proposal
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / translator / ErrorTranslator.java
index 9c1eedb320cc8445afa1dc56d2383390a8344016..b00bfce6cda8f357a94caf5a61503666ce1bf2ed 100644 (file)
+/**
+ * Copyright (c) 2013-2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
 package org.opendaylight.openflowplugin.openflow.md.core.translator;
 
-
 import java.math.BigInteger;
 
-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.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.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+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.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.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.SwitchConfigErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.TableFeaturesErrorNotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.node.error.service.rev140410.TableModErrorNotificationBuilder;
 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, DataObject> {
-
-       protected static final Logger LOG = LoggerFactory.getLogger(ErrorTranslator.class);
-       @Override
-       public DataObject translate(SwitchConnectionDistinguisher cookie,
-                       SessionContext sc, OfHeader msg) {
-               if( msg instanceof ErrorMessage) {
-                       ErrorMessage message = (ErrorMessage)msg ;
-                       LOG.error(" Error Message received: type={}, code={}, data={} ", 
-                       message.getType(), message.getCode(),
-                       new String(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.setCode(message.getCode()); 
-               
-                       nodeErrBuilder.setType(ErrorType.forValue(message.getType().getIntValue())); 
-                       
-                       nodeErrBuilder.setData( new String( message.getData() ) ) ;
-                       
-                       // TODO -- Augmentation is not handled
-                        
-                       // Note Error_TypeV10 is not handled.
-                       
-                       NodeErrorNotification nodeErrorEvent = nodeErrBuilder.build() ;
-                       
-                       return nodeErrorEvent;
-               }else {
-                       LOG.error( "Message is not of Error Message " ) ;
-                       return null;
-               }
-       }
+
+/**
+ * OF-1.3 errorMessage support
+ */
+public class ErrorTranslator extends AbstractErrorTranslator {
+
+    @Override
+    public ErrorType decodeErrorType(int type) {
+        return ErrorType.forValue(type);
+    }
+
+    @Override
+    public org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorMessage getGranularNodeErrors(ErrorMessage message, ErrorType errorType, NodeRef node){
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorMessage outErrorMessage = null;
+        TransactionId txnId = new TransactionId(BigInteger.valueOf(message.getXid()));
+
+        //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(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.BadRequest) {
+            BadRequestErrorNotificationBuilder builder = new BadRequestErrorNotificationBuilder ();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.BadAction) {
+            BadActionErrorNotificationBuilder builder = new BadActionErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.BadInstruction) {
+            BadInstructionErrorNotificationBuilder builder = new BadInstructionErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.BadMatch) {
+            BadMatchErrorNotificationBuilder builder = new BadMatchErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.FlowModFailed) {
+            FlowModErrorNotificationBuilder builder = new FlowModErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.GroupModFailed) {
+            GroupModErrorNotificationBuilder builder = new GroupModErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.PortModFailed) {
+            PortModErrorNotificationBuilder builder = new PortModErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.QueueOpFailed) {
+            QueueOpErrorNotificationBuilder builder = new QueueOpErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.SwitchConfigFailed) {
+            SwitchConfigErrorNotificationBuilder builder = new SwitchConfigErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.RoleRequestFailed) {
+            RoleRequestErrorNotificationBuilder builder = new RoleRequestErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.MeterModFailed) {
+            MeterModErrorNotificationBuilder builder = new MeterModErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.TableModFailed) {
+            TableModErrorNotificationBuilder builder = new TableModErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.TableFeaturesFailed) {
+            TableFeaturesErrorNotificationBuilder builder = new TableFeaturesErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        } else if (errorType == ErrorType.Experimenter) {
+            ExperimenterErrorNotificationBuilder builder = new ExperimenterErrorNotificationBuilder();
+            builder.setTransactionId(txnId);
+            builder.setType(errorType);
+            builder.setCode(message.getCode());
+            builder.setNode(node);
+            if (message.getData() != null) {
+                builder.setData(new String(message.getData()));
+            }
+            outErrorMessage = builder.build();
+        }
+
+        return outErrorMessage;
+    }
 
 }