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;
}
}