Adding FlowRef,MeterRef and GroupRef for the Error message
[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 java.math.BigInteger;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.concurrent.CopyOnWriteArrayList;
14
15 import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
16 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
17 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
18 import org.opendaylight.openflowplugin.openflow.md.core.session.TransactionKey;
19 import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.errors.rev131116.ErrorType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotificationBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.FlowRefBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.GroupRefBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.node.error.notification.object.reference.MeterRefBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionMetadata;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.NodeGroup;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.NodeMeter;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
33 import org.opendaylight.yangtools.yang.binding.DataObject;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 public class ErrorTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
38
39     protected static final Logger LOG = LoggerFactory.getLogger(ErrorTranslator.class);
40
41     @Override
42     public List<DataObject> translate(SwitchConnectionDistinguisher cookie, SessionContext sc, OfHeader msg) {
43         if (msg instanceof ErrorMessage) {
44             ErrorMessage message = (ErrorMessage) msg;
45             List<DataObject> list = new CopyOnWriteArrayList<DataObject>();
46             LOG.debug(" Error Message received: type={}[{}], code={}[{}], data=[{}] ", message.getType(),
47                     message.getTypeString(), message.getCode(), message.getCodeString(),
48                     ByteUtil.bytesToHexstring(message.getData(), " "));
49
50             // create a Node Error Notification event builder
51             NodeErrorNotificationBuilder nodeErrBuilder = new NodeErrorNotificationBuilder();
52
53             // Fill in the Node Error Notification Builder object from the Error
54             // Message
55
56             nodeErrBuilder.setTransactionId(new TransactionId(BigInteger.valueOf(message.getXid())));
57
58             Object object = sc.getbulkTransactionCache().getIfPresent(new TransactionKey(message.getXid()));
59             if (object != null) {
60                 nodeErrBuilder.setTransactionUri(((TransactionMetadata) object).getTransactionUri());
61                 FlowRefBuilder flowRef = new FlowRefBuilder();
62                 GroupRefBuilder groupRef = new GroupRefBuilder();
63                 MeterRefBuilder meterRef = new MeterRefBuilder();
64                 if (object instanceof NodeFlow) {
65                     FlowEntityData flowEntry = new FlowEntityData();
66                     flowRef = flowEntry.getBuilder(object);
67                     nodeErrBuilder.setObjectReference(flowRef.build());
68                 } else if (object instanceof NodeGroup) {
69                     GroupEntityData groupEntry = new GroupEntityData();
70                     groupRef = groupEntry.getBuilder(object);
71                     nodeErrBuilder.setObjectReference(groupRef.build());
72
73                 } else if (object instanceof NodeMeter) {
74                     MeterEntityData meterEntry = new MeterEntityData();
75                     meterRef = meterEntry.getBuilder(object);
76                     nodeErrBuilder.setObjectReference(meterRef.build());
77
78                 }
79
80             }
81
82             nodeErrBuilder.setType(ErrorType.forValue(message.getType()));
83
84             nodeErrBuilder.setCode(message.getCode());
85
86             nodeErrBuilder.setData(new String(message.getData()));
87
88             // TODO -- Augmentation is not handled
89
90             // Note Error_TypeV10 is not handled.
91
92             NodeErrorNotification nodeErrorEvent = nodeErrBuilder.build();
93             list.add(nodeErrorEvent);
94             return list;
95         } else {
96             LOG.error("Message is not of Error Message ");
97             return Collections.emptyList();
98         }
99     }
100
101 }