import datetime
import os
import sys
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
import time
import django.utils
from core.models.sliver import Sliver
from core.models.reservation import Reservation, ReservedResource

class ReservationAgent:

    def run(self):
        while True :
            slivers = {}

            tNow = django.utils.timezone.now()
            print "Processing reservations, tNow is %s" % tNow
            reservations = Reservation.objects.filter(startTime__lte = tNow)
            for reservation in reservations:
                print "  Processing reservation %s" % reservation
                if reservation.endTime <= tNow:
                    print "    deleting expired reservation"
                    reservation.delete()
                for reservedResource in reservation.reservedresources.all():
                    sliver_resources = slivers.get(reservedResource.sliver.id, {})
                    sliver_resources[reservedResource.resource.name] = reservedResource.quantity
                    slivers[reservedResource.sliver.id] = sliver_resources

            print "Sliver reservation set"
            for (sliverid, sliver_resources) in slivers.items():
                print "  sliver", sliverid,
                for (name, value) in sliver_resources.items():
                    print str(name)+":", value,
                print

            print "Updating slivers"
            for sliver in Sliver.objects.all():
                sliver_resv = slivers.get(sliver.id, {})
                numberCores = sliver_resv.get("numberCores", 0)
                if numberCores != sliver.numberCores:
                    print "sliver %s setting numberCores to %s" % (sliver.name, numberCores)
                    sliver.numberCores = numberCores
                    sliver.save()

            print "sleep"
            time.sleep(7)


if __name__ == '__main__':
    ReservationAgent().run()
                 
