package es.tid.pce.server; import java.net.Inet4Address; import java.util.Enumeration; import java.util.Hashtable; import java.util.LinkedList; import java.util.TimerTask; 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.ospf.ospfv2.lsa.tlv.subtlv.IPv4RemoteASBRID; import es.tid.ospf.ospfv2.lsa.tlv.subtlv.LinkLocalRemoteIdentifiers; import es.tid.ospf.ospfv2.lsa.tlv.subtlv.RemoteASNumber; import es.tid.pce.pcep.constructs.Notify; import es.tid.pce.pcep.messages.PCEPNotification; import es.tid.pce.pcep.objects.Notification; import es.tid.pce.pcep.objects.ObjectParameters; 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.StorageTLV; import es.tid.tedb.DomainTEDB; import es.tid.tedb.InterDomainEdge; import es.tid.tedb.SimpleITTEDB; /** * TimerTask in which the child PCE sends the inter-domain links to the Parent PCE * @author mcs * */ public class ITSendTopologyTask extends TimerTask { private DomainTEDB tedb; private Logger log; private ChildPCESessionManager pcm; /** * Construct new TimeTask which sends the inter-domain links * Domain TEDB, traffic Engineering Database * ChildPCESessionManager */ ITSendTopologyTask(DomainTEDB tedb,ChildPCESessionManager pcm) { this.tedb = tedb; this.log =LoggerFactory.getLogger("PCEServer"); this.pcm = pcm; } /** * Method run sends the inter-domain links to the Parent PCE */ public void run() { log.info("Showing interDomain links"); LinkedList<InterDomainEdge> interDomainLinks= tedb.getInterDomainLinks(); int size = interDomainLinks.size(); if (size == 0){ log.warn("Size 0. There is not interdomain links"); } for (int i=0;i<size;i++){ log.info("Source: "+interDomainLinks.get(i).getSrc_router_id()+"\tInterface id: "+interDomainLinks.get(i).getSrc_if_id() +"\nDestiny: "+ interDomainLinks.get(i).getDst_router_id()+"\tInterface id: "+interDomainLinks.get(i).getDst_if_id()); } //Send the interdomain-links to the Parent PCE //Para todos los nodos de borde del dominio for (int i=0;i<size;i++){ //Parte nueva: Enviar los enlaces inter dominio al padre. //1.- Create a notification message: NOTIFICATION Object-Class is 12 and NOTIFICATION Object-Type is 1. PCEPNotification notificationMessage = new PCEPNotification(); //2.- Create Notify Object Notify notify = new Notify(); LinkedList<Notification> notificationList = new LinkedList<Notification>(); //3.- Create Object Notification Notification notification=new Notification(); //3.1.- Set Notification type = PCEP_NOTIFICATION_TYPE_TOPOLOGY=101 notification.setNotificationType(ObjectParameters.PCEP_NOTIFICATION_TYPE_TOPOLOGY); //4.- Create a LinkTLV LinkTLV linkTLV = new LinkTLV(); //4.1.- Configurate the Header of the linkTLV //LinkLocalRemoteIdentifiers: interfaces de red LinkLocalRemoteIdentifiers linkLocalRemoteId = new LinkLocalRemoteIdentifiers(); linkLocalRemoteId.setLinkLocalIdentifier(interDomainLinks.get(i).getSrc_if_id()); linkLocalRemoteId.setLinkRemoteIdentifier(interDomainLinks.get(i).getDst_if_id()); linkTLV.setLinkLocalRemoteIdentifiers(linkLocalRemoteId); //RemoteASNumber: identifica el dominio remoto RemoteASNumber remoteASNumber = new RemoteASNumber(); log.info("Remote AS nNumner "+interDomainLinks.get(i).getDomain_dst_router()); remoteASNumber.setRemoteASNumber((Inet4Address)interDomainLinks.get(i).getDomain_dst_router()); linkTLV.setRemoteASNumber(remoteASNumber); //IPv4RemoteASBRID: direccion IP del Router Remoto IPv4RemoteASBRID iPv4RemoteASBRID = new IPv4RemoteASBRID(); iPv4RemoteASBRID.setIPv4RemoteASBRID((Inet4Address)interDomainLinks.get(i).getDst_router_id()); linkTLV.setIPv4RemoteASBRID(iPv4RemoteASBRID); //5.- Create a interASTEv2LSA InterASTEv2LSA interASTEv2LSA = new InterASTEv2LSA(); //5.1.- Advertising Router (del LSA): IP del router que manda el notify (son routers de borde) interASTEv2LSA.setAdvertisingRouter((Inet4Address)interDomainLinks.get(i).getSrc_router_id()); //5.2.- Add LinkTLV interASTEv2LSA.setLinkTLV(linkTLV); //6.- Create the TLV OSPFTE_LSA_TLV ospfte_lsa_tlv = new OSPFTE_LSA_TLV(); ospfte_lsa_tlv.setInterASTEv2LSA(interASTEv2LSA); //7.- Add the TLV and the notification object notification.addOSPFTE_LSA_TLV(ospfte_lsa_tlv); notificationList.add(notification); notify.setNotificationList(notificationList); notificationMessage.addNotify(notify); //8.- Send the notification to the PCE parent pcm.getSendingQueue().add(notificationMessage); } log.info("Showing IT Resources"); Hashtable<StorageTLV, Object> StorageAndSite = ((SimpleITTEDB)tedb).getStorageCharacteristics(); //potencialmente CORREGIBLE Enumeration <StorageTLV> storages = StorageAndSite.keys(); while (storages.hasMoreElements()){ StorageTLV storage = storages.nextElement(); log.info("Storage "+storage.getResourceIDSubTLV().getResourceID().toString()+" has TotalSize:"+ storage.storageSize.getTotalSize()+" and AvailableSize"+storage.storageSize.getAvailableSize() +" and UsageUnit:"+storage.getCostList().getFirst().getUsageUnit().toString()+" and UnitaryCost:"+ storage.getCostList().getFirst().getUnitaryPrice().toString()); PCEPNotification notificationMessage = new PCEPNotification(); //2.- Create Notify Object Notify notify = new Notify(); LinkedList<Notification> notificationList = new LinkedList<Notification>(); //3.- Create Object Notification Notification notification=new Notification(); //3.1.- Set Notification type = PCEP_NOTIFICATION_TYPE_TOPOLOGY=101 notification.setNotificationType(ObjectParameters.PCEP_NOTIFICATION_TYPE_IT_RESOURCE_INFORMATION); //3.2.- Set Notification value = PCEP_NOTIFICATION_VALUE_UPDATE=0x01 notification.setNotificationValue(ObjectParameters.PCEP_NOTIFICATION_VALUE_UPDATE); //7.- Add the TLV and the notification object ITAdvertisementTLV ITadvtlv = new ITAdvertisementTLV(); ITadvtlv.setAdv_ID((Inet4Address)StorageAndSite.get(storage)); ITadvtlv.setAdv_Type(0x01); ITadvtlv.setVirtual_IT_Site_ID((Inet4Address)StorageAndSite.get(storage)); notification.setITadvtlv(ITadvtlv); notification.setStoragetlv(storage); log.info("UnitaryPrice:"+(storage.costList.getFirst().getUnitaryPrice()).toString()); notificationList.add(notification); notify.setNotificationList(notificationList); notificationMessage.addNotify(notify); //8.- Send the notification to the PCE parent pcm.getSendingQueue().add(notificationMessage); } return; } }