/** * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved. * * @author Andra Cismaru */ package net.juniper.contrail.vcenter; import java.util.Iterator; import java.util.SortedMap; import java.util.Map.Entry; import java.util.concurrent.ConcurrentSkipListMap; import org.apache.log4j.Logger; public class MainDB { private static volatile SortedMap<String, VirtualNetworkInfo> vmwareVNs = new ConcurrentSkipListMap<String, VirtualNetworkInfo>(); private static volatile SortedMap<String, VirtualMachineInfo> vmwareVMs = new ConcurrentSkipListMap<String, VirtualMachineInfo>(); static volatile VncDB vncDB; private static volatile VCenterDB vcenterDB; private static volatile Mode mode; private final static Logger s_logger = Logger.getLogger(MainDB.class); public static SortedMap<String, VirtualNetworkInfo> getVNs() { return vmwareVNs; } public static SortedMap<String, VirtualMachineInfo> getVMs() { return vmwareVMs; } public static VirtualNetworkInfo getVnByName(String name) { for (VirtualNetworkInfo vnInfo: vmwareVNs.values()) { if (vnInfo.getName().equals(name)) { return vnInfo; } } return null; } public static VirtualMachineInfo getVmByName(String name) { for (VirtualMachineInfo vmInfo: vmwareVMs.values()) { if (vmInfo.getName().equals(name)) { return vmInfo; } } return null; } public static VirtualNetworkInfo getVnById(String uuid) { if (vmwareVNs.containsKey(uuid)) { return vmwareVNs.get(uuid); } return null; } public static void created(VirtualNetworkInfo vnInfo) { vmwareVNs.put(vnInfo.getUuid(), vnInfo); } public static void updated(VirtualNetworkInfo vnInfo) { if (!vmwareVNs.containsKey(vnInfo.getUuid())) { vmwareVNs.put(vnInfo.getUuid(), vnInfo); } } public static void deleted(VirtualNetworkInfo vnInfo) { if (vmwareVNs.containsKey(vnInfo.getUuid())) { vmwareVNs.remove(vnInfo.getUuid()); } } public static void deleteVirtualNetwork(VirtualNetworkInfo vnInfo) { if (vmwareVNs.containsKey(vnInfo.getUuid())) { vmwareVNs.remove(vnInfo.getUuid()); } } public static VirtualMachineInfo getVmById(String uuid) { if (vmwareVMs.containsKey(uuid)) { return vmwareVMs.get(uuid); } return null; } public static void created(VirtualMachineInfo vmInfo) { vmwareVMs.put(vmInfo.getUuid(), vmInfo); } public static void updated(VirtualMachineInfo vmInfo) { if (!vmwareVMs.containsKey(vmInfo.getUuid())) { vmwareVMs.put(vmInfo.getUuid(), vmInfo); } } public static void deleted(VirtualMachineInfo vmInfo) { if (vmwareVMs.containsKey(vmInfo.getUuid())) { vmwareVMs.remove(vmInfo.getUuid()); } } public static <K extends Comparable<K>, V extends VCenterObject> void sync(SortedMap<K, V> oldMap, SortedMap<K, V> newMap) { Iterator<Entry<K, V>> oldIter = oldMap.entrySet().iterator(); Entry<K, V> oldEntry = oldIter.hasNext()? oldIter.next() : null; Iterator<Entry<K, V>> newIter = newMap.entrySet().iterator(); Entry<K, V> newEntry = newIter.hasNext()? newIter.next() : null; while (oldEntry != null && newEntry != null) { Integer cmp = newEntry.getKey().compareTo(oldEntry.getKey()); try { if (cmp == 0) { newEntry.getValue().sync(oldEntry.getValue(), vncDB); oldEntry = oldIter.hasNext()? oldIter.next() : null; newEntry = newIter.hasNext()? newIter.next() : null; } else if (cmp < 0) { if (mode != Mode.VCENTER_AS_COMPUTE) { newEntry.getValue().create(vncDB); } newEntry = newIter.hasNext()? newIter.next() : null; } else { if (mode != Mode.VCENTER_AS_COMPUTE) { oldEntry.getValue().delete(vncDB); } oldEntry = oldIter.hasNext()? oldIter.next() : null; } } catch (Exception e) { s_logger.error("Cannot sync old [" + oldEntry.getKey() + ", " + oldEntry.getValue() + "] with new [" + newEntry.getKey() + ", " + newEntry.getValue() + "]" ); } } if (mode != Mode.VCENTER_AS_COMPUTE) { while (oldEntry != null) { try { oldEntry.getValue().delete(vncDB); } catch (Exception e) { s_logger.error("Cannot delete old [" + oldEntry.getKey() + ", " + oldEntry.getValue() + "]"); } oldEntry = oldIter.hasNext()? oldIter.next() : null; } } while (newEntry != null) { try { newEntry.getValue().create(vncDB); } catch (Exception e) { s_logger.error("Cannot create new [" + newEntry.getKey() + ", " + newEntry.getValue() + "]" ); } newEntry = newIter.hasNext()? newIter.next() : null; } } public static <K extends Comparable<K>, V extends VCenterObject> void update(SortedMap<K, V> oldMap, SortedMap<K, V> newMap) { Iterator<Entry<K, V>> oldIter = oldMap.entrySet().iterator(); Entry<K, V> oldEntry = oldIter.hasNext()? oldIter.next() : null; Iterator<Entry<K, V>> newIter = newMap.entrySet().iterator(); Entry<K, V> newEntry = newIter.hasNext()? newIter.next() : null; while (oldEntry != null && newEntry != null) { Integer cmp = newEntry.getKey().compareTo(oldEntry.getKey()); try { if (cmp == 0) { oldEntry.getValue().update(newEntry.getValue(), vncDB); oldEntry = oldIter.hasNext()? oldIter.next() : null; newEntry = newIter.hasNext()? newIter.next() : null; } else if (cmp < 0) { newEntry.getValue().create(vncDB); newEntry = newIter.hasNext()? newIter.next() : null; } else { oldEntry.getValue().delete(vncDB); oldEntry = oldIter.hasNext()? oldIter.next() : null; } } catch (Exception e) { s_logger.error("Cannot update old [" + oldEntry.getKey() + ", " + oldEntry.getValue() + "] with new [" + newEntry.getKey() + ", " + newEntry.getValue() + "]" ); } } while (oldEntry != null) { try { oldEntry.getValue().delete(vncDB); } catch (Exception e) { s_logger.error("Cannot delete old [" + oldEntry.getKey() + ", " + oldEntry.getValue() + "]"); } oldEntry = oldIter.hasNext()? oldIter.next() : null; } while (newEntry != null) { try { newEntry.getValue().create(vncDB); } catch (Exception e) { s_logger.error("Cannot create new [" + newEntry.getKey() + ", " + newEntry.getValue() + "]" ); } newEntry = newIter.hasNext()? newIter.next() : null; } } public static void sync(VCenterDB _vcenterDB, VncDB _vncDB, Mode _mode) throws Exception { vcenterDB = _vcenterDB; vncDB = _vncDB; mode = _mode; vmwareVNs.clear(); vmwareVMs.clear(); vmwareVNs = vcenterDB.readVirtualNetworks(); SortedMap<String, VirtualNetworkInfo> oldVNs = vncDB.readVirtualNetworks(); sync(oldVNs, vmwareVNs); vmwareVMs = vcenterDB.readVirtualMachines(); SortedMap<String, VirtualMachineInfo> oldVMs = vncDB.readVirtualMachines(); VRouterNotifier.syncVrouterAgent(); sync(oldVMs, vmwareVMs); printInfo(); } private static void printInfo() { s_logger.debug("\nFound " + vmwareVNs.size() + " Virtual Networks after sync:"); for (VirtualNetworkInfo vnInfo: vmwareVNs.values()) { s_logger.debug(vnInfo.toStringBuffer()); } s_logger.debug("\nFound " + vmwareVMs.size() + " Virtual Machines after sync:"); for (VirtualMachineInfo vmInfo: vmwareVMs.values()) { s_logger.debug(vmInfo.toStringBuffer()); } s_logger.debug("\n"); } }