import os
import json
import sys
import time

sys.path.append("/opt/xos")

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
from openstack.manager import OpenStackManager
from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice

TEST_SITE_NAME = "Princeton University"
TEST_USER_EMAIL = "sbaker@planetstack.org"
TEST_IMAGE_NAME = "Fedora 16 LXC rev 1.3"
TEST_NODE_NAME = "viccidev3.cs.princeton.edu"
TEST_DEPLOYMENT_NAME = "VICCI"

def fail(msg):
    print msg
    sys.exit(-1)

def fail_unless(condition, msg):
    if not condition:
        fail(msg)

class PlanetStackTest:
    def __init__(self):
        self.objs_saved = []
        self.counter = 0

    def setup(self):
        self.manager = OpenStackManager()

        print "getting test site"
        self.testSite = Site.objects.get(name=TEST_SITE_NAME)

        print "getting test user"
        self.testUser = User.objects.get(email=TEST_USER_EMAIL)

        print "getting test image"
        self.testImage = Image.objects.get(name=TEST_IMAGE_NAME)

        print "getting test node"
        self.testNode = Node.objects.get(name=TEST_NODE_NAME)

        print "getting test deployment"
        self.testDeployment = Deployment.objects.get(name=TEST_DEPLOYMENT_NAME)

    def save_and_wait_for_enacted(self, x, nonempty_fields=[]):
        print "saving", x.__class__.__name__, str(x)
        x.save()
        self.objs_saved.append(x)
        print "   waiting for", str(x), "to be enacted"
        tStart = time.time()
        while True:
            new_x = x.__class__.objects.get(id=x.id)
            if (new_x.enacted != None) and (new_x.enacted >= new_x.updated):
                print "  ", str(x), "has been enacted"
                break
            time.sleep(5)

        if nonempty_fields:
            print "   waiting for", ", ".join(nonempty_fields), "to be nonempty"
            while True:
                new_x = x.__class__.objects.get(id=x.id)
                keep_waiting=False
                for field in nonempty_fields:
                    if not getattr(new_x, field, None):
                        keep_waiting=True
                if not keep_waiting:
                    break

        print "   saved and enacted in %d seconds" % int(time.time() - tStart)

        return new_x

    def make_slice_name(self):
        self.counter = self.counter +1
        return "test-" + str(time.time()) + "." + str(self.counter)

    def get_network_template(self,name):
        template = NetworkTemplate.objects.get(name=name)
        return template

    def cleanup(self):
        print "cleaning up"
        print "press return"
        sys.stdin.readline()
        for obj in self.objs_saved:
            try:
                 print "  deleting", str(obj)
                 obj.delete()
            except:
                 print "failed to delete", str(obj)
