*/
package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
+import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
+
import com.google.common.base.Optional;
+
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
+
import org.apache.commons.lang3.StringUtils;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.groupbasedpolicy.neutron.ovsdb.AbstractTunnelType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfacesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.Tunnel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbBridgeFromTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.OvsdbHelper.getOvsdbTerminationPoint;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs;
-import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.submitToDs;
-
public class InventoryHelper {
private static final Logger LOG = LoggerFactory.getLogger(InventoryHelper.class);
private static final String HEX = "0x";
/**
- * Convert an OpenFlow Datapath ID to a Long
+ * Convert an OpenFlow Datapath ID to a Long.
*
* @param dpid The OpenFlow Datapath ID
* @return The Long representation of the DPID
* augmentation, converting that to a Long, and prepending it with the
* "openflow:" prefix.
*
- * @param ovsdbBridge The OVSDB bridge augmentation
+ * @param ovsdbBridge The {@link OvsdbBridgeAugmentation}
+ * @param ovsdbTpIid the {@link OvsdbTerminationPointAugmentation}
+ * @param dataBroker the {@link DataBroker}
* @return String representation of the Inventory NodeId, null if it fails
*/
public static String getInventoryNodeIdString(OvsdbBridgeAugmentation ovsdbBridge,
*
* @param inventoryNodeId The string representation of the Inventory NodeId
* @param ovsdbTp The {@link OvsdbTerminationPointAugmentation}
+ * @param tpIid the InstanceIdentifier for OvsdbTerminationPointAugmentation
+ * @param dataBroker the {@link DataBroker}
* @return String representation of the Inventory NodeConnectorId, null if it fails
*/
public static String getInventoryNodeConnectorIdString(String inventoryNodeId,
/**
* Read the {@link OfOverlayNodeConfig} augmentation from the
* Inventory Node, and verify that the tunnel types we need
- * are present
+ * are present.
*
+ * @param nodeIdString The inventory node id string
+ * @param requiredTunnelTypes the list of tunnel types
+ * @param dataBroker the {@link DataBroker}
* @return true if tunnel types are present, false otherwise
*/
public static boolean checkOfOverlayConfig(String nodeIdString, List<AbstractTunnelType> requiredTunnelTypes,
return true;
}
- public static void addOfOverlayExternalPort(String nodeIdString, NodeConnectorId ncId, DataBroker dataBroker) {
+ public static InstanceIdentifier<ExternalInterfaces> addOfOverlayExternalPort(NodeId nodeId, NodeConnectorId ncId,
+ DataBroker dataBroker) {
InstanceIdentifier<ExternalInterfaces> nodeExternalInterfacesIid = InstanceIdentifier.builder(Nodes.class)
- .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+ .child(Node.class, new NodeKey(nodeId))
.augmentation(OfOverlayNodeConfig.class)
.child(ExternalInterfaces.class, new ExternalInterfacesKey(ncId))
.build();
ExternalInterfaces externalInterfaces = new ExternalInterfacesBuilder().setKey(new ExternalInterfacesKey(ncId))
.setNodeConnectorId(ncId)
.build();
- WriteTransaction transaction = dataBroker.newReadWriteTransaction();
+ WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
transaction.put(LogicalDatastoreType.CONFIGURATION, nodeExternalInterfacesIid, externalInterfaces, true);
- submitToDs(transaction);
- LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(), nodeIdString);
+ DataStoreHelper.submitToDs(transaction);
+ LOG.trace("Added external interface node connector {} to node {}", ncId.getValue(), nodeId.getValue());
+ return nodeExternalInterfacesIid;
}
public static OfOverlayNodeConfig getOfOverlayConfig(String nodeIdString, DataBroker dataBroker) {
return null;
}
- private static boolean addOfOverlayAugmentation(OfOverlayNodeConfig config, String nodeIdString, DataBroker dataBroker) {
- InstanceIdentifier<OfOverlayNodeConfig> ofOverlayNodeIid = InstanceIdentifier.builder(Nodes.class)
- .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
- .augmentation(OfOverlayNodeConfig.class)
- .build();
-
- WriteTransaction transaction = dataBroker.newReadWriteTransaction();
- transaction.put(LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, config, true);
- return submitToDs(transaction);
- }
-
/**
- * Update the {@link OfOverlayConfig} of an Inventory Node
+ * Update the {@link OfOverlayNodeConfig} of an Inventory Node
* using the new tunnel state.
*
- * @param ip
- * @param nodeIdString
- * @param nodeConnectorIdString
- * @param tunnelType
- * @param dataBroker
+ * @param ip the ipaddress
+ * @param nodeIdString the string representation of the inventory NodeId
+ * @param nodeConnectorIdString the string representation of the inventory NodeConnectorId
+ * @param tunnelType the tunnel type
+ * @param dataBroker the {@link DataBroker}
*/
public static void updateOfOverlayConfig(IpAddress ip, String nodeIdString, String nodeConnectorIdString,
AbstractTunnelType tunnelType, DataBroker dataBroker) {
Set<Tunnel> existingTunnels = new HashSet<Tunnel>();
if (ofConfig != null) {
ofOverlayNodeConfigBuilder = new OfOverlayNodeConfigBuilder(ofConfig);
- if(ofConfig.getTunnel() != null) {
+ if (ofConfig.getTunnel() != null) {
existingTunnels.addAll(ofConfig.getTunnel());
}
} else {
ofOverlayNodeConfigBuilder.setTunnel(new ArrayList<Tunnel>(existingTunnels));
}
OfOverlayNodeConfig newConfig = ofOverlayNodeConfigBuilder.build();
- if (addOfOverlayAugmentation(newConfig, nodeIdString, dataBroker)) {
- LOG.trace("updateOfOverlayConfig - Added Tunnel: {} to Node: {} at NodeConnector: {}",tunnelBuilder.build(), nodeIdString, nodeConnectorIdString);
- return;
+ if (addOfOverlayConfig(newConfig, new NodeId(nodeIdString), dataBroker)) {
+ LOG.trace("updateOfOverlayConfig - Added Tunnel: {} to Node: {} at NodeConnector: {}",
+ tunnelBuilder.build(), nodeIdString, nodeConnectorIdString);
} else {
LOG.error("updateOfOverlayConfig - could not write OfOverlayNodeConfig: {} to datastore.", newConfig);
}
// runs only if some tunnels were really removed
if (existingTunnels.removeAll(tunnelsToRemove)) {
- OfOverlayNodeConfigBuilder ofOverlayBuilder;
- if (ofConfig == null) {
- ofOverlayBuilder = new OfOverlayNodeConfigBuilder();
- } else {
- ofOverlayBuilder = new OfOverlayNodeConfigBuilder(ofConfig);
+ ReadWriteTransaction writeTx = dataBroker.newReadWriteTransaction();
+ for (Tunnel tunnel : tunnelsToRemove) {
+ InstanceIdentifier<Tunnel> tunnelIid = InstanceIdentifier.builder(Nodes.class)
+ .child(Node.class, new NodeKey(new NodeId(nodeIdString)))
+ .augmentation(OfOverlayNodeConfig.class)
+ .child(Tunnel.class, tunnel.getKey())
+ .build();
+ writeTx.delete(LogicalDatastoreType.CONFIGURATION, tunnelIid);
+ LOG.trace("Removing tunnel: {} from node {}",tunnel, nodeIdString);
}
- ofOverlayBuilder.setTunnel(existingTunnels);
- addOfOverlayAugmentation(ofOverlayBuilder.build(), nodeIdString, dataBroker);
+ submitToDs(writeTx);
+ }
+ }
+
+ private static boolean addOfOverlayConfig(OfOverlayNodeConfig newConfig, NodeId nodeId, DataBroker dataBroker) {
+ ReadWriteTransaction writeTx = dataBroker.newReadWriteTransaction();
+ InstanceIdentifier<OfOverlayNodeConfig> ofOverlayNodeIid = InstanceIdentifier.builder(Nodes.class)
+ .child(Node.class, new NodeKey(nodeId))
+ .augmentation(OfOverlayNodeConfig.class)
+ .build();
+ writeTx.put(LogicalDatastoreType.CONFIGURATION, ofOverlayNodeIid, newConfig, true);
+ LOG.trace("Adding tunnel: {} to node {}", newConfig, nodeId.getValue());
+ return submitToDs(writeTx);
+ }
+
+ private static boolean addTunnelsOfOverlayConfig(List<Tunnel> tunnels, NodeId nodeId, DataBroker dataBroker) {
+ ReadWriteTransaction writeTx = dataBroker.newReadWriteTransaction();
+ for (Tunnel tunnel : tunnels) {
+ InstanceIdentifier<Tunnel> tunnelIid = InstanceIdentifier.builder(Nodes.class)
+ .child(Node.class, new NodeKey(nodeId))
+ .augmentation(OfOverlayNodeConfig.class)
+ .child(Tunnel.class, tunnel.getKey())
+ .build();
+ writeTx.put(LogicalDatastoreType.CONFIGURATION, tunnelIid, tunnel, true);
+ LOG.trace("Adding tunnel: {} to node {}",tunnel, nodeId.getValue());
}
+ return submitToDs(writeTx);
}
}