corefx - changes to reuse deleted subnets
This commit is contained in:
parent
0661f5d601
commit
338439b429
2 changed files with 54 additions and 2 deletions
|
@ -7,18 +7,31 @@ import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
public class CoreAddresses {
|
public class CoreAddresses {
|
||||||
private static final Logger logger = LogManager.getLogger();
|
private static final Logger logger = LogManager.getLogger();
|
||||||
private IPAddress currentSubnet = new IPAddressString("10.0.0.0/24").getAddress();
|
private IPAddress currentSubnet = new IPAddressString("10.0.0.0/24").getAddress().toPrefixBlock();
|
||||||
private AtomicBoolean firstSubnet = new AtomicBoolean(true);
|
private AtomicBoolean firstSubnet = new AtomicBoolean(true);
|
||||||
|
private Queue<IPAddress> deleted = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
|
public void reuseSubnet(IPAddress subnet) {
|
||||||
|
deleted.add(subnet);
|
||||||
|
}
|
||||||
|
|
||||||
public IPAddress nextSubnet() {
|
public IPAddress nextSubnet() {
|
||||||
logger.info("getting next subnet: {}", currentSubnet);
|
logger.info("getting next subnet: {}", currentSubnet);
|
||||||
if (!firstSubnet.getAndSet(false)) {
|
if (!firstSubnet.getAndSet(false)) {
|
||||||
currentSubnet = currentSubnet.incrementBoundary(1).toPrefixBlock();
|
IPAddress deletedSubnet = deleted.poll();
|
||||||
|
if (deletedSubnet != null) {
|
||||||
|
currentSubnet = deletedSubnet;
|
||||||
|
} else {
|
||||||
|
currentSubnet = currentSubnet.incrementBoundary(1).toPrefixBlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
logger.info("getting updated boundary: {}", currentSubnet);
|
logger.info("getting updated boundary: {}", currentSubnet);
|
||||||
return currentSubnet;
|
return currentSubnet;
|
||||||
|
@ -43,6 +56,12 @@ public class CoreAddresses {
|
||||||
.orElseGet(() -> currentSubnet);
|
.orElseGet(() -> currentSubnet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
deleted.clear();
|
||||||
|
firstSubnet.set(true);
|
||||||
|
currentSubnet = new IPAddressString("10.0.0.0/24").getAddress().toPrefixBlock();
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String... args) {
|
public static void main(String... args) {
|
||||||
IPAddress addresses = new IPAddressString("10.0.0.0/16").getAddress();
|
IPAddress addresses = new IPAddressString("10.0.0.0/16").getAddress();
|
||||||
System.out.println(String.format("address: %s", addresses.increment(257)));
|
System.out.println(String.format("address: %s", addresses.increment(257)));
|
||||||
|
|
|
@ -248,6 +248,7 @@ public class NetworkGraph {
|
||||||
}
|
}
|
||||||
nodeMap.clear();
|
nodeMap.clear();
|
||||||
graphViewer.repaint();
|
graphViewer.repaint();
|
||||||
|
coreAddresses.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updatePositions() {
|
public void updatePositions() {
|
||||||
|
@ -417,6 +418,38 @@ public class NetworkGraph {
|
||||||
private void handleEdgeRemoved(GraphEvent.Edge<CoreNode, CoreLink> edgeEvent) {
|
private void handleEdgeRemoved(GraphEvent.Edge<CoreNode, CoreLink> edgeEvent) {
|
||||||
CoreLink link = edgeEvent.getEdge();
|
CoreLink link = edgeEvent.getEdge();
|
||||||
logger.info("removed edge: {}", link);
|
logger.info("removed edge: {}", link);
|
||||||
|
CoreNode nodeOne = getVertex(link.getNodeOne());
|
||||||
|
CoreInterface interfaceOne = link.getInterfaceOne();
|
||||||
|
CoreNode nodeTwo = getVertex(link.getNodeTwo());
|
||||||
|
CoreInterface interfaceTwo = link.getInterfaceTwo();
|
||||||
|
boolean nodeOneIsDefault = isNode(nodeOne);
|
||||||
|
boolean nodeTwoIsDefault = isNode(nodeTwo);
|
||||||
|
|
||||||
|
// check what we are unlinking
|
||||||
|
Set<CoreInterface> interfaces;
|
||||||
|
IPAddress subnet = null;
|
||||||
|
if (nodeOneIsDefault && nodeTwoIsDefault) {
|
||||||
|
subnet = interfaceOne.getIp4().toPrefixBlock();
|
||||||
|
logger.info("unlinking node to node reuse subnet: {}", subnet);
|
||||||
|
} else if (nodeOneIsDefault) {
|
||||||
|
interfaces = getNetworkInterfaces(nodeTwo, new HashSet<>());
|
||||||
|
if (interfaces.isEmpty()) {
|
||||||
|
subnet = interfaceOne.getIp4().toPrefixBlock();
|
||||||
|
logger.info("unlinking node one from network reuse subnet: {}", subnet);
|
||||||
|
}
|
||||||
|
} else if (nodeTwoIsDefault) {
|
||||||
|
interfaces = getNetworkInterfaces(nodeOne, new HashSet<>());
|
||||||
|
if (interfaces.isEmpty()) {
|
||||||
|
subnet = interfaceTwo.getIp4().toPrefixBlock();
|
||||||
|
logger.info("unlinking node two from network reuse subnet: {}", subnet);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.info("nothing to do when unlinking networks");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subnet != null) {
|
||||||
|
coreAddresses.reuseSubnet(subnet);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleVertexAdded(GraphEvent.Vertex<CoreNode, CoreLink> vertexEvent) {
|
private void handleVertexAdded(GraphEvent.Vertex<CoreNode, CoreLink> vertexEvent) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue