package org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer;
+import java.util.HashSet;
+import java.util.Set;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.CheckedFuture;
import com.google.common.util.concurrent.Futures;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.List;
-
public class PolicyWriter {
private static final Logger LOG = LoggerFactory.getLogger(PolicyWriter.class);
private final DataBroker mountpoint;
// Local cache
- private final List<ClassMap> classMapEntries;
- private final List<Class> policyMapEntries;
- private final List<ServiceFfName> remoteForwarders;
- private final List<ServiceChain> serviceChains;
+ private final Set<ClassMap> classMapEntries;
+ private final Set<Class> policyMapEntries;
+ private final Set<ServiceFfName> remoteForwarders;
+ private final Set<ServiceChain> serviceChains;
private final NodeId nodeId;
private final String interfaceName;
private final String policyMapName;
public PolicyWriter(final DataBroker dataBroker, final String interfaceName, final String ipAddress,
final String policyMapName, final NodeId nodeId) {
- classMapEntries = new ArrayList<>();
- policyMapEntries = new ArrayList<>();
- remoteForwarders = new ArrayList<>();
- serviceChains = new ArrayList<>();
+ classMapEntries = new HashSet<>();
+ policyMapEntries = new HashSet<>();
+ remoteForwarders = new HashSet<>();
+ serviceChains = new HashSet<>();
this.nodeId = Preconditions.checkNotNull(nodeId);
mountpoint = Preconditions.checkNotNull(dataBroker);
this.policyMapName = Preconditions.checkNotNull(policyMapName);
}
- public void cache(ClassMap classMap) {
- classMapEntries.add(classMap);
- }
-
- public void cache(List<Class> policyMapEntries) {
- this.policyMapEntries.addAll(policyMapEntries);
- }
-
- public void cache(ServiceFfName remoteForwarder) {
- remoteForwarders.add(remoteForwarder);
- }
-
- public void cache(ServiceChain serviceChain) {
- serviceChains.add(serviceChain);
- }
-
public CheckedFuture<Boolean, TransactionCommitFailedException> commitToDatastore() {
- LOG.info("Configuring policy on node {} ... ", nodeId.getValue());
+ LOG.debug("Configuring policy on node {}, interface {} ... ", nodeId.getValue(), interfaceName);
+ if (policyMapEntries.isEmpty()) {
+ LOG.debug("Policy map {} is empty, skipping", policyMapName);
+ return Futures.immediateCheckedFuture(true);
+ }
// SFC
boolean remoteResult = PolicyWriterUtil.writeRemote(remoteForwarders, nodeId, mountpoint);
boolean servicePathsResult = PolicyWriterUtil.writeServicePaths(serviceChains, nodeId, mountpoint);
boolean policyMapResult = PolicyWriterUtil.writePolicyMap(policyMapName, policyMapEntries, nodeId, mountpoint);
boolean interfaceResult = PolicyWriterUtil.writeInterface(policyMapName, interfaceName, nodeId, mountpoint);
// Result
- LOG.info("Policy configuration on node {} completed", nodeId.getValue());
+ LOG.info("Policy-map created on node {}, interface {}", nodeId.getValue(), interfaceName);
return Futures.immediateCheckedFuture(classMapResult && policyMapResult && interfaceResult && remoteResult
&& servicePathsResult);
}
public CheckedFuture<Boolean, TransactionCommitFailedException> removeFromDatastore() {
- LOG.info("Removing policy from node {} ... ", nodeId.getValue());
+ LOG.debug("Removing policy from node {}, interface {} ... ", nodeId.getValue(), interfaceName);
+ if (policyMapEntries.isEmpty()) {
+ LOG.debug("Policy map {} is empty, nothing to remove", policyMapName);
+ return Futures.immediateCheckedFuture(true);
+ }
// GBP - maintain order!
boolean policyMapEntriesResult = PolicyWriterUtil.removePolicyMapEntries(policyMapName, policyMapEntries,
nodeId, mountpoint);
boolean classMapResult = PolicyWriterUtil.removeClassMaps(classMapEntries, nodeId, mountpoint);
- // TODO remove class map?
// SFC
+ boolean remoteSffResult = PolicyWriterUtil.removeRemote(remoteForwarders, nodeId, mountpoint);
boolean servicePathsResult = PolicyWriterUtil.removeServicePaths(serviceChains, nodeId, mountpoint);
- // TODO remove remote forwarders
// Result
- LOG.info("Policy removed from node {}", nodeId.getValue());
- return Futures.immediateCheckedFuture(classMapResult && policyMapEntriesResult && servicePathsResult);
+ LOG.info("Policy-map removed from node {}, interface {}", nodeId.getValue(), interfaceName);
+ return Futures.immediateCheckedFuture(classMapResult && policyMapEntriesResult && servicePathsResult
+ && remoteSffResult);
+ }
+
+ public void cache(ClassMap classMap) {
+ classMapEntries.add(classMap);
+ }
+
+ public void cache(Class policyMapEntry) {
+ this.policyMapEntries.add(policyMapEntry);
+ }
+
+ public void cache(ServiceFfName remoteForwarder) {
+ remoteForwarders.add(remoteForwarder);
+ }
+
+ public void cache(ServiceChain serviceChain) {
+ serviceChains.add(serviceChain);
}
public String getManagementIpAddress() {
return managementIpAddress;
}
- public DataBroker getCurrentMountpoint() {
+ public DataBroker getMountpoint() {
return mountpoint;
}
- public NodeId getCurrentNodeId() {
+ public NodeId getNodeId() {
return nodeId;
}
}