package es.tid.pce.parentPCE; import java.net.Inet4Address; import java.net.Inet6Address; import java.util.LinkedList; import java.util.concurrent.LinkedBlockingQueue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import es.tid.ospf.ospfv2.lsa.InterASTEv2LSA; import es.tid.ospf.ospfv2.lsa.tlv.LinkTLV; import es.tid.pce.pcep.objects.Notification; import es.tid.pce.pcep.objects.tlvs.ITAdvertisementTLV; import es.tid.pce.pcep.objects.tlvs.OSPFTE_LSA_TLV; import es.tid.pce.pcep.objects.tlvs.ServerTLV; import es.tid.pce.pcep.objects.tlvs.StorageTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.BlockSizeSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.CostSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.EPaddressSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.IdleConsumptionSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.InterStateLatenciesSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.LocationSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.MTUSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.MaxSpeedSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.MaximumConsumptionSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.NetworkAdapterSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.NetworkSpecSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.PowerInfoSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.PowerStateSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.PowerSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.ResourceIDSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.ServerStorageSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.SleepConsumptionSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.StorageInfoSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.StorageSizeSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.TNAIPv4SubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.TNAIPv6SubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.TNANSAPSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.VolumeInfoSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.VolumeSizeSubTLV; import es.tid.pce.pcep.objects.tlvs.subtlvs.VolumeSubTLV; import es.tid.tedb.ITMDTEDB; import es.tid.tedb.MDTEDB; /** * Receives notifications with topology updates and maintains the multidomain topology * @author ogondio * */ public class MultiDomainTopologyUpdaterThread extends Thread { /** * The Logger */ private Logger log; /** * Queue with the Updates to process */ private LinkedBlockingQueue<MultiDomainUpdate> multiDomainUpdateQueue; // Multi-domain TEDB private MDTEDB multiDomainTEDB; //IT Capable Multi-domain TEDB private ITMDTEDB ITmultiDomainTEDB; //List of the received LSAs private LinkedList<InterASTEv2LSA> interASTEv2LSAList; public MultiDomainTopologyUpdaterThread(LinkedBlockingQueue<MultiDomainUpdate> multiDomainUpdateQueue,MDTEDB multiDomainTEDB){ log=LoggerFactory.getLogger("MultiDomainTologyUpdater"); this.multiDomainUpdateQueue=multiDomainUpdateQueue; this.multiDomainTEDB=multiDomainTEDB; interASTEv2LSAList=new LinkedList<InterASTEv2LSA>(); } public MultiDomainTopologyUpdaterThread(LinkedBlockingQueue<MultiDomainUpdate> multiDomainUpdateQueue,ITMDTEDB ITmultiDomainTEDB){ log=LoggerFactory.getLogger("MultiDomainTologyUpdater"); this.multiDomainUpdateQueue=multiDomainUpdateQueue; this.ITmultiDomainTEDB=ITmultiDomainTEDB; } public void run() { log.info("Starting Multidomain Topology Upadater Thread"); MultiDomainUpdate multiDomainUpdate; Notification notif; while(true){ try { multiDomainUpdate=multiDomainUpdateQueue.take(); notif=multiDomainUpdate.getNotif(); log.debug("Processing Notification to update topology"); ITAdvertisementTLV ITadv = notif.getITadvtlv(); if (ITadv!=null){ log.info("IT advertisement received!!"); //Ale: cambiar logs "info" por "finest" Inet4Address IT_site = ITadv.getVirtual_IT_Site_ID(); log.info("Virtual IT site ID:"+IT_site); int AdvType = ITadv.getAdv_Type(); log.info("Advertisement type:"+AdvType); int AdvTrigger = ITadv.getAdv_Trigger(); log.info("Advertisement trigger:"+AdvTrigger); StorageTLV Storage = notif.getStoragetlv(); if(Storage != null){ Inet4Address ResourceID = null; int TotalStorageSize = 0; int AvailableStorageSize = 0; log.info("Storage:"); ResourceIDSubTLV ResourceIDsubtlv = Storage.getResourceIDSubTLV(); if(ResourceIDsubtlv != null){ ResourceID = ResourceIDsubtlv.getResourceID(); log.info("Resource ID:"+ResourceID); } LocationSubTLV Locationsubtlv = Storage.getLocationSubTLV(); if(Locationsubtlv != null){ int LaRes = Locationsubtlv.getLaRes(); log.info("Latitude Resolution:"+LaRes); byte[] Latitude = Locationsubtlv.getLatitude(); log.info("Latitude:"+Latitude); int LoRes = Locationsubtlv.getLoRes(); log.info("Longitude Resolution:"+LoRes); byte[] Longitude = Locationsubtlv.getLongitude(); log.info("Longitude:"+Longitude); } LinkedList<CostSubTLV> CostsubtlvList = Storage.getCostList(); if(CostsubtlvList != null){ for (int i=0; i<CostsubtlvList.size(); i++){ CostSubTLV Costsubtlv = CostsubtlvList.get(i); log.info("Coste "+i+": Unit:"+Costsubtlv.getUsageUnit()+" Unitari price:"+Costsubtlv.getUnitaryPrice()); } } NetworkSpecSubTLV NetworkSpecsubtlv = Storage.getNetworkSpecSubTLV(); if(NetworkSpecsubtlv != null){ EPaddressSubTLV EPaddresssubtlv = NetworkSpecsubtlv.getEPaddress(); if(EPaddresssubtlv != null){ String EPaddress = EPaddresssubtlv.getEPaddress(); } TNAIPv4SubTLV TNAipv4subtlv = NetworkSpecsubtlv.getTNAIPv4(); if(TNAipv4subtlv != null){ Inet4Address IPv4address = TNAipv4subtlv.getIPv4address(); } TNAIPv6SubTLV TNAipv6subtlv = NetworkSpecsubtlv.getTNAIPv6(); if(TNAipv6subtlv != null){ Inet6Address IPv6address = TNAipv6subtlv.getIPv6address(); } TNANSAPSubTLV TNANSAPsubtlv = NetworkSpecsubtlv.getTNANSAP(); if(TNANSAPsubtlv != null){ byte[] NSAPaddress = TNANSAPsubtlv.getNSAPaddress(); } MTUSubTLV MTUsubtlv = NetworkSpecsubtlv.getMTU(); if(MTUsubtlv != null){ byte[] MTU = MTUsubtlv.getMTU(); } MaxSpeedSubTLV Maxspeedsubtlv = NetworkSpecsubtlv.getMaxSpeed(); if(Maxspeedsubtlv != null){ byte[] MaxSpeed = Maxspeedsubtlv.getMaxSpeed(); } NetworkAdapterSubTLV Networkadaptersubtlv = NetworkSpecsubtlv.getNetworkAdapter(); if(Networkadaptersubtlv != null){ int NetworkAdapter = Networkadaptersubtlv.getAdapter_Type(); int FullDupplex = Networkadaptersubtlv.getFullDupplex(); } } PowerSubTLV Powersubtlv = Storage.getPowerSubTLV(); if(Powersubtlv != null){ PowerInfoSubTLV PowerInfosubtlv = Powersubtlv.getPowerInfo(); if (PowerInfosubtlv != null){ int PowerSource = PowerInfosubtlv.getPowerSource(); int PowerClass = PowerInfosubtlv.getPowerClass(); int Regeneration = PowerInfosubtlv.getRegeneration(); } MaximumConsumptionSubTLV MaxConsumptionsubtlv = Powersubtlv.getMaximumConsumptionSubTLV(); if (MaxConsumptionsubtlv != null){ byte[] MaxConsumption = MaxConsumptionsubtlv.getMaximumConsumption(); } IdleConsumptionSubTLV IdleConsumptionsubtlv = Powersubtlv.getIdleConsumption(); if (IdleConsumptionsubtlv != null){ byte[] IdleConsumption = IdleConsumptionsubtlv.getIdleConsumption(); } SleepConsumptionSubTLV SleepConsumptionsubtlv = Powersubtlv.getSleepConsumption(); if (SleepConsumptionsubtlv != null){ byte[] SleepConsumption = SleepConsumptionsubtlv.getSleepConsumption(); } InterStateLatenciesSubTLV InterStateLatenciessubtlv = Powersubtlv.getInterStateLatencies(); if (InterStateLatenciessubtlv != null){ byte[] WakeUpLatency = InterStateLatenciessubtlv.getWakeUpLatency(); byte[] PowerUpLatency = InterStateLatenciessubtlv.getPowerUpLatency(); } PowerStateSubTLV PowerStatesubtlv = Powersubtlv.getPowerState(); if (PowerStatesubtlv != null){ byte PowerState = PowerStatesubtlv.getPowerState(); } } StorageSizeSubTLV StorageSizesubtlv = Storage.getStorageSizeSubTLV(); if(StorageSizesubtlv != null){ TotalStorageSize = StorageSizesubtlv.getTotalSize(); log.info("Total Size:"+TotalStorageSize); AvailableStorageSize = StorageSizesubtlv.getAvailableSize(); log.info("Available Size:"+AvailableStorageSize); } StorageInfoSubTLV StorageInfosubtlv = Storage.getStorageInfoSubTLV(); if(StorageInfosubtlv != null){ int AccessStatus = StorageInfosubtlv.getAccessStatus(); int Volatil = StorageInfosubtlv.getVolatil(); } LinkedList<VolumeSubTLV> VolumesubtlvList = Storage.getVolumeList(); if(VolumesubtlvList != null){ for (int i=0; i<VolumesubtlvList.size(); i++){ VolumeSubTLV Volumesubtlv = VolumesubtlvList.get(i); VolumeSizeSubTLV VolumeSizesubtlv = Volumesubtlv.getVolumeSize(); if(VolumeSizesubtlv != null){ int TotalVolumeSize = VolumeSizesubtlv.getTotalSize(); int AvailableVolumeSize = VolumeSizesubtlv.getAvailableSize(); } BlockSizeSubTLV BlockSizesubtlv = Volumesubtlv.getBlockSizeSubTLV(); if(BlockSizesubtlv != null){ byte[] BlockSize = BlockSizesubtlv.getBlockSize(); } VolumeInfoSubTLV VolumeInfosubtlv = Volumesubtlv.getVolumeInfo(); if(VolumeInfosubtlv != null){ int AccessStatus = VolumeInfosubtlv.getAccessStatus(); int Volatil = VolumeInfosubtlv.getVolatil(); } } } Inet4Address domainID=multiDomainUpdate.getDomainID(); ITmultiDomainTEDB.addStorage(domainID, IT_site, AdvType, ResourceID, CostsubtlvList, TotalStorageSize, AvailableStorageSize); } ServerTLV Server = notif.getServertlv(); if(Server != null){ log.info("Server:"); ResourceIDSubTLV ResourceIDsubtlv = Server.getResourceIDSubTLV(); if(ResourceIDsubtlv != null){ Inet4Address ResourceID = ResourceIDsubtlv.getResourceID(); log.info("Resource ID:"+ResourceID); } LocationSubTLV Locationsubtlv = Server.getLocationSubTLV(); if(Locationsubtlv != null){ int LaRes = Locationsubtlv.getLaRes(); log.info("Latitude Resolution:"+LaRes); byte[] Latitude = Locationsubtlv.getLatitude(); log.info("Latitude:"+Latitude); int LoRes = Locationsubtlv.getLoRes(); log.info("Longitude Resolution:"+LoRes); byte[] Longitude = Locationsubtlv.getLongitude(); log.info("Longitude:"+Longitude); } LinkedList<CostSubTLV> CostsubtlvList = Server.getCostList(); if(CostsubtlvList != null){ for (int i=0; i<CostsubtlvList.size(); i++){ CostSubTLV Costsubtlv = CostsubtlvList.get(i); log.info("Coste "+i+": Unit:"+Costsubtlv.getUsageUnit()+" Unitari price:"+Costsubtlv.getUnitaryPrice()); } } NetworkSpecSubTLV NetworkSpecsubtlv = Server.getNetworkSpecSubTLV(); if(NetworkSpecsubtlv != null){ EPaddressSubTLV EPaddresssubtlv = NetworkSpecsubtlv.getEPaddress(); if(EPaddresssubtlv != null){ String EPaddress = EPaddresssubtlv.getEPaddress(); } TNAIPv4SubTLV TNAipv4subtlv = NetworkSpecsubtlv.getTNAIPv4(); if(TNAipv4subtlv != null){ Inet4Address IPv4address = TNAipv4subtlv.getIPv4address(); } TNAIPv6SubTLV TNAipv6subtlv = NetworkSpecsubtlv.getTNAIPv6(); if(TNAipv6subtlv != null){ Inet6Address IPv6address = TNAipv6subtlv.getIPv6address(); } TNANSAPSubTLV TNANSAPsubtlv = NetworkSpecsubtlv.getTNANSAP(); if(TNANSAPsubtlv != null){ byte[] NSAPaddress = TNANSAPsubtlv.getNSAPaddress(); } MTUSubTLV MTUsubtlv = NetworkSpecsubtlv.getMTU(); if(MTUsubtlv != null){ byte[] MTU = MTUsubtlv.getMTU(); } MaxSpeedSubTLV Maxspeedsubtlv = NetworkSpecsubtlv.getMaxSpeed(); if(Maxspeedsubtlv != null){ byte[] MaxSpeed = Maxspeedsubtlv.getMaxSpeed(); } NetworkAdapterSubTLV Networkadaptersubtlv = NetworkSpecsubtlv.getNetworkAdapter(); if(Networkadaptersubtlv != null){ int NetworkAdapter = Networkadaptersubtlv.getAdapter_Type(); int FullDupplex = Networkadaptersubtlv.getFullDupplex(); } } PowerSubTLV Powersubtlv = Server.getPowerSubTLV(); if(Powersubtlv != null){ PowerInfoSubTLV PowerInfosubtlv = Powersubtlv.getPowerInfo(); if (PowerInfosubtlv != null){ int PowerSource = PowerInfosubtlv.getPowerSource(); int PowerClass = PowerInfosubtlv.getPowerClass(); int Regeneration = PowerInfosubtlv.getRegeneration(); } MaximumConsumptionSubTLV MaxConsumptionsubtlv = Powersubtlv.getMaximumConsumptionSubTLV(); if (MaxConsumptionsubtlv != null){ byte[] MaxConsumption = MaxConsumptionsubtlv.getMaximumConsumption(); } IdleConsumptionSubTLV IdleConsumptionsubtlv = Powersubtlv.getIdleConsumption(); if (IdleConsumptionsubtlv != null){ byte[] IdleConsumption = IdleConsumptionsubtlv.getIdleConsumption(); } SleepConsumptionSubTLV SleepConsumptionsubtlv = Powersubtlv.getSleepConsumption(); if (SleepConsumptionsubtlv != null){ byte[] SleepConsumption = SleepConsumptionsubtlv.getSleepConsumption(); } InterStateLatenciesSubTLV InterStateLatenciessubtlv = Powersubtlv.getInterStateLatencies(); if (InterStateLatenciessubtlv != null){ byte[] WakeUpLatency = InterStateLatenciessubtlv.getWakeUpLatency(); byte[] PowerUpLatency = InterStateLatenciessubtlv.getPowerUpLatency(); } PowerStateSubTLV PowerStatesubtlv = Powersubtlv.getPowerState(); if (PowerStatesubtlv != null){ byte PowerState = PowerStatesubtlv.getPowerState(); } } ServerStorageSubTLV ServerStoragesubtlv = Server.getServerStorageSubTLV(); if(ServerStoragesubtlv != null){ StorageSizeSubTLV StorageSizesubtlv = ServerStoragesubtlv.getStorageSize(); if(StorageSizesubtlv != null){ int TotalSize = StorageSizesubtlv.getTotalSize(); log.info("Total Size:"+TotalSize); int AvailableSize = StorageSizesubtlv.getAvailableSize(); log.info("Available Size:"+AvailableSize); } StorageInfoSubTLV StorageInfosubtlv = ServerStoragesubtlv.getStorageInfoSubTLV(); if(StorageInfosubtlv != null){ int AccessStatus = StorageInfosubtlv.getAccessStatus(); int Volatil = StorageInfosubtlv.getVolatil(); } LinkedList<VolumeSubTLV> VolumesubtlvList = ServerStoragesubtlv.getVolumeList(); if(VolumesubtlvList != null){ for (int i=0; i<VolumesubtlvList.size(); i++){ VolumeSubTLV Volumesubtlv = VolumesubtlvList.get(i); VolumeSizeSubTLV VolumeSizesubtlv = Volumesubtlv.getVolumeSize(); if(VolumeSizesubtlv != null){ int TotalSize = VolumeSizesubtlv.getTotalSize(); int AvailableSize = VolumeSizesubtlv.getAvailableSize(); } BlockSizeSubTLV BlockSizesubtlv = Volumesubtlv.getBlockSizeSubTLV(); if(BlockSizesubtlv != null){ byte[] BlockSize = BlockSizesubtlv.getBlockSize(); } VolumeInfoSubTLV VolumeInfosubtlv = Volumesubtlv.getVolumeInfo(); if(VolumeInfosubtlv != null){ int AccessStatus = VolumeInfosubtlv.getAccessStatus(); int Volatil = VolumeInfosubtlv.getVolatil(); } } } } } }else{ //THIS IS THE PART OF MULTI-DOMAIN TOPOLOGY LinkedList<OSPFTE_LSA_TLV>LSATLVList= notif.getLSATLVList(); if (LSATLVList!=null){ log.debug("Received OPSF_TE_LSA_TLV "+LSATLVList.size()+" LSAs"); for (int i=0; i<LSATLVList.size();++i){ OSPFTE_LSA_TLV tlv= LSATLVList.get(i); //log.finest("Type of TLV: "+LSATLVList.size()); InterASTEv2LSA interASTEv2LSA=tlv.getInterASTEv2LSA(); if (interASTEv2LSA!=null){ log.debug("InterASTEv2LSA received: "+interASTEv2LSA.printHeader()); if (interASTEv2LSAList.contains(interASTEv2LSA)){ log.debug("LSA already present"); }else { log.debug("NEW LSA, adding to the list and processing"); interASTEv2LSAList.add(interASTEv2LSA); LinkTLV linkTLV =interASTEv2LSA.getLinkTLV(); if (linkTLV!=null){ log.debug("Processing LinkTLV"); try { Inet4Address remoteAS=tlv.getInterASTEv2LSA().getLinkTLV().getRemoteASNumber().getRemoteASNumber(); log.debug("Remote AS: "+remoteAS); Inet4Address remoteASBR=tlv.getInterASTEv2LSA().getLinkTLV().getiPv4RemoteASBRID().getIPv4RemoteASBRID(); log.debug("Remote ASBR: "+remoteASBR); Inet4Address localAS=multiDomainUpdate.getDomainID(); log.debug("Local AS: "+localAS); Inet4Address localASBR=tlv.getInterASTEv2LSA().getAdvertisingRouter(); log.debug("Local ASBR: "+localASBR); long localRouterASBRIf=tlv.getInterASTEv2LSA().getLinkTLV().getLinkLocalRemoteIdentifiers().getLinkLocalIdentifier(); long remoteRouterASBRIf=tlv.getInterASTEv2LSA().getLinkTLV().getLinkLocalRemoteIdentifiers().getLinkRemoteIdentifier(); if(ITmultiDomainTEDB==null){ multiDomainTEDB.addInterdomainLink(localAS, localASBR, localRouterASBRIf, remoteAS, remoteASBR, remoteRouterASBRIf,null); }else{ ITmultiDomainTEDB.addInterdomainLink(localAS, localASBR, localRouterASBRIf, remoteAS, remoteASBR, remoteRouterASBRIf,null); } }catch (Exception e){ log.error("Problem with Link TLV "+e.getStackTrace()); } } } } } }else { log.warn("LSATLVList esta a null"); } } //notif.getNotifyList(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(-1); } } } public String printLSAList(){ StringBuffer sb=new StringBuffer(20+interASTEv2LSAList.size()*100); sb.append(interASTEv2LSAList.size()); sb.append(" LSAs\r\n"); for (int i=0;i<interASTEv2LSAList.size();++i){ sb.append(i); sb.append("--> "); sb.append(interASTEv2LSAList.get(i).toString()); sb.append("\r\n"); sb.append("------------------------\r\n"); sb.append("\r\n"); } return sb.toString(); } public String printLSAShortList(){ StringBuffer sb=new StringBuffer(20+interASTEv2LSAList.size()*100); sb.append(interASTEv2LSAList.size()); sb.append(" LSAs\r\n"); for (int i=0;i<interASTEv2LSAList.size();++i){ sb.append(i); sb.append("--> "); sb.append(interASTEv2LSAList.get(i).printShort()); sb.append("\r\n"); sb.append("------------------------\r\n"); sb.append("\r\n"); } return sb.toString(); } public int sizeLSAList(){ return interASTEv2LSAList.size(); } }