Merge "L2 Gw create changes related to ITM Tunnels creation in neutronvpn module"
[vpnservice.git] / interfacemgr / interfacemgr-impl / src / main / java / org / opendaylight / vpnservice / interfacemgr / renderer / ovs / utilities / SouthboundUtils.java
index 4bf4d42f30ca91a8003280e7e032c8a931ad773b..9fbd1b7dc063ab68e8ea57cc5269d67f50211a40 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. 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,
@@ -12,12 +12,17 @@ import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils;
+import org.opendaylight.vpnservice.mdsalutil.NwConstants;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.*;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
@@ -32,6 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.vpnservice.interfacemgr.renderer.hwvtep.utilities.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,6 +47,13 @@ import java.util.Map;
 
 public class SouthboundUtils {
     private static final Logger LOG = LoggerFactory.getLogger(SouthboundUtils.class);
+
+    public static final String BFD_PARAM_ENABLE = "enable";
+    public static final String BFD_PARAM_INTERVAL = "min_tx";
+    // bfd params
+    public static final String BFD_OP_STATE = "state";
+    public static final String BFD_STATE_UP = "up";
+
     public static final TopologyId OVSDB_TOPOLOGY_ID = new TopologyId(new Uri("ovsdb:1"));
 
     public static void addPortToBridge(InstanceIdentifier<?> bridgeIid, Interface iface,
@@ -51,12 +64,28 @@ public class SouthboundUtils {
         if (ifTunnel != null) {
             addTunnelPortToBridge(ifTunnel, bridgeIid, iface, bridgeAugmentation, bridgeName, portName, dataBroker, tx);
         }
+        futures.add(tx.submit());
+    }
 
-        IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class);
-        if (ifL2vlan != null) {
-            addVlanPortToBridge(bridgeIid, ifL2vlan, bridgeAugmentation, bridgeName, portName, dataBroker, tx);
+    /*
+     *  add all tunnels ports corresponding to the bridge to the topology config DS
+     */
+    public static void addAllPortsToBridge(BridgeEntry bridgeEntry, DataBroker dataBroker,
+                                           InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
+                                           OvsdbBridgeAugmentation bridgeNew,
+                                           WriteTransaction writeTransaction){
+        String bridgeName = bridgeNew.getBridgeName().getValue();
+        LOG.debug("adding all ports to bridge: {}", bridgeName);
+        List<BridgeInterfaceEntry> bridgeInterfaceEntries = bridgeEntry.getBridgeInterfaceEntry();
+        for (BridgeInterfaceEntry bridgeInterfaceEntry : bridgeInterfaceEntries) {
+            String portName = bridgeInterfaceEntry.getInterfaceName();
+            InterfaceKey interfaceKey = new InterfaceKey(portName);
+            Interface iface = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(interfaceKey, dataBroker);
+            IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class);
+            if (ifTunnel != null) {
+                addTunnelPortToBridge(ifTunnel, bridgeIid, iface, bridgeNew, bridgeName, portName, dataBroker, writeTransaction);
+            }
         }
-        futures.add(tx.submit());
     }
 
     public static void addBridge(InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
@@ -79,11 +108,13 @@ public class SouthboundUtils {
         futures.add(tx.submit());
     }
 
-    private static void addVlanPortToBridge(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan,
+    private static void addVlanPortToBridge(InstanceIdentifier<?> bridgeIid, IfL2vlan ifL2vlan, IfTunnel ifTunnel,
                                               OvsdbBridgeAugmentation bridgeAugmentation, String bridgeName,
                                               String portName, DataBroker dataBroker, WriteTransaction t) {
-        int vlanId = ifL2vlan.getVlanId().getValue();
-        addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, null, null, dataBroker, t);
+        if(ifL2vlan.getVlanId() != null) {
+            addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, ifL2vlan.getVlanId().getValue(), null, null,
+                            ifTunnel, t);
+        }
     }
 
     private static void addTunnelPortToBridge(IfTunnel ifTunnel, InstanceIdentifier<?> bridgeIid, Interface iface,
@@ -106,7 +137,7 @@ public class SouthboundUtils {
 
         int vlanId = 0;
         IfL2vlan ifL2vlan = iface.getAugmentation(IfL2vlan.class);
-        if (ifL2vlan != null) {
+        if (ifL2vlan != null && ifL2vlan.getVlanId() != null) {
             vlanId = ifL2vlan.getVlanId().getValue();
         }
 
@@ -119,12 +150,30 @@ public class SouthboundUtils {
         IpAddress remoteIp = ifTunnel.getTunnelDestination();
         options.put("remote_ip", remoteIp.getIpv4Address().getValue());
 
-        addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, type, options, dataBroker, t);
+        addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, vlanId, type, options, ifTunnel, t);
     }
 
-    private static void addTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode,
-                                            String bridgeName, String portName, int vlanId, Class type,
-                                            Map<String, String> options, DataBroker dataBroker, WriteTransaction t) {
+    // Update is allowed only for tunnel monitoring attributes
+    public static void updateBfdParamtersForTerminationPoint(InstanceIdentifier<?> bridgeIid, IfTunnel ifTunnel, String portName,
+                                               WriteTransaction transaction){
+        if( !ifTunnel.isInternal() && ifTunnel.getTunnelInterfaceType().equals(TunnelTypeVxlan.class) ) {
+            InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
+                    InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), portName);
+            LOG.debug("update bfd parameters for interface {}", tpIid);
+            OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
+            List<InterfaceBfd> bfdParams = getBfdParams(ifTunnel);
+            tpAugmentationBuilder.setInterfaceBfd(bfdParams);
+
+            TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
+            tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
+            tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
+
+            transaction.merge(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
+        }
+    }
+
+    private static void addTerminationPoint(InstanceIdentifier<?> bridgeIid, OvsdbBridgeAugmentation bridgeNode, String bridgeName, String portName, int vlanId, Class type,
+                                            Map<String, String> options, IfTunnel ifTunnel, WriteTransaction t) {
         InstanceIdentifier<TerminationPoint> tpIid = createTerminationPointInstanceIdentifier(
                 InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), portName);
         OvsdbTerminationPointAugmentationBuilder tpAugmentationBuilder = new OvsdbTerminationPointAugmentationBuilder();
@@ -152,11 +201,34 @@ public class SouthboundUtils {
                 tpAugmentationBuilder.setVlanTag(new VlanId(vlanId));
         }
 
+
+        if( !ifTunnel.isInternal() && ifTunnel.getTunnelInterfaceType().equals(TunnelTypeVxlan.class) ) {
+            List<InterfaceBfd> bfdParams = getBfdParams(ifTunnel);
+            tpAugmentationBuilder.setInterfaceBfd(bfdParams);
+        }
+
         TerminationPointBuilder tpBuilder = new TerminationPointBuilder();
         tpBuilder.setKey(InstanceIdentifier.keyOf(tpIid));
         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
 
         t.put(LogicalDatastoreType.CONFIGURATION, tpIid, tpBuilder.build(), true);
+
+    }
+
+    private static List<InterfaceBfd> getBfdParams(IfTunnel ifTunnel) {
+        List<InterfaceBfd> bfdParams = new ArrayList<>();
+        bfdParams.add(getIfBfdObj(BFD_PARAM_ENABLE,
+                        Boolean.toString(ifTunnel.isMonitorEnabled())));
+        bfdParams.add(getIfBfdObj(BFD_PARAM_INTERVAL,
+                ifTunnel.getMonitorInterval().toString()));
+        return bfdParams;
+    }
+
+    private static InterfaceBfd getIfBfdObj(String key, String value) {
+        InterfaceBfdBuilder bfdBuilder = new InterfaceBfdBuilder();
+        bfdBuilder.setBfdKey(key).
+                        setKey(new InterfaceBfdKey(key)).setBfdValue(value);
+        return bfdBuilder.build();
     }
 
     private static InstanceIdentifier<TerminationPoint> createTerminationPointInstanceIdentifier(Node node,
@@ -189,4 +261,4 @@ public class SouthboundUtils {
                 .child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
                 .child(Node.class,new NodeKey(nodeId));
     }
-}
\ No newline at end of file
+}