/*
- * 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,
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;
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;
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,
futures.add(tx.submit());
}
+ /*
+ * 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);
+ }
+ }
+ }
+
public static void addBridge(InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
OvsdbBridgeAugmentation bridgeAugmentation,
DataBroker dataBroker, List<ListenableFuture<Void>> futures){
+ LOG.debug("adding bridge: {}", bridgeAugmentation.getBridgeName());
WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
NodeId nodeId = InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)).getNodeId();
NodeBuilder bridgeNodeBuilder = new NodeBuilder();
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) {
if(ifL2vlan.getVlanId() != null) {
- addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, ifL2vlan.getVlanId().getValue(), null, null, dataBroker, t);
+ addTerminationPoint(bridgeIid, bridgeAugmentation, bridgeName, portName, ifL2vlan.getVlanId().getValue(), null, null,
+ ifTunnel, t);
}
}
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();
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,
.child(Topology.class, new TopologyKey(OVSDB_TOPOLOGY_ID))
.child(Node.class,new NodeKey(nodeId));
}
-}
\ No newline at end of file
+}