diff --git a/planetstack/tests/hpc_wizard.py b/planetstack/tests/hpc_wizard.py
deleted file mode 100644
index fae7047..0000000
--- a/planetstack/tests/hpc_wizard.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import datetime
-import os
-import operator
-import socket
-import pytz
-import json
-import random
-import sys
-import time
-
-#sys.path.append("/opt/planetstack")
-sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
-from core.models import Slice, Sliver, ServiceClass, Reservation, Tag, Network, User, Node, Image, Deployment, Site, NetworkTemplate, NetworkSlice, Service
-from hpc.models import HpcService, ServiceProvider, ContentProvider, OriginServer, CDNPrefix, HpcService
-
-def format_float(x):
-    try:
-        return "%10.5f" % x
-    except:
-        return str(x)
-
-class HpcWizard:
-    def __init__(self):
-        self.hpcService = HpcService.objects.get()
-
-    def get_hpc_slices(self):
-        slices = self.hpcService.slices.all()
-        return slices
-
-    def get_hpc_slivers(self):
-        slivers = []
-        for slice in self.get_hpc_slices():
-            for sliver in slice.slivers.all():
-                slivers.append(sliver)
-        return slivers
-
-    def fill_site_nodes(self, site, hpc_slivers=None):
-        if hpc_slivers is None:
-            hpc_slivers = self.get_hpc_slivers()
-
-        site.availNodes = []
-        site.hpcNodes = []
-        for node in site.nodes.all():
-            has_hpc = False
-            for sliver in node.slivers.all():
-                if sliver in hpc_slivers:
-                    has_hpc = True
-            if has_hpc:
-                site.hpcNodes.append(node)
-            else:
-                site.availNodes.append(node)
-
-    def get_sites(self):
-        sites = list(Site.objects.all())
-
-        for site in sites:
-            self.fill_site_nodes(site, self.get_hpc_slivers())
-
-        return sites
-
-    def get_site(self, site_name):
-        site = Site.objects.get(name=site_name)
-        self.fill_site_nodes(site)
-        return site
-
-    def increase_slivers(self, site_name, count):
-        site = self.get_site(site_name)
-        hpc_slice = self.get_hpc_slices()[0]
-        while (len(site.availNodes) > 0) and (count > 0):
-            node = site.availNodes.pop()
-            hostname = node.name
-            sliver = Sliver(name=node.name,
-                            slice=hpc_slice,
-                            node=node,
-                            image = Image.objects.all()[0],
-                            creator = User.objects.get(email="scott@onlab.us"),
-                            deploymentNetwork=node.deployment,
-                            numberCores = 1,
-                            ip=socket.gethostbyname(hostname))
-            sliver.save()
-
-            print "created sliver", sliver
-
-            site.hpcNodes.append(node)
-
-            count = count - 1
-
-    def decrease_slivers(self, site_name, count):
-        site = self.get_site(site_name)
-        hpc_slices = self.get_hpc_slices()
-        while (len(site.hpcNodes) > 0) and (count > 0):
-            node = site.hpcNodes.pop()
-            for sliver in node.slivers.all():
-                if sliver.slice in hpc_slices:
-                     print "deleting sliver", sliver
-                     sliver.delete()
-
-            site.availNodes.append(node)
-            count = count - 1
-
-    def dump(self):
-        print "slices:"
-        for slice in self.get_hpc_slices():
-            print "  ", slice
-
-        print "sites:"
-        print "%20s %10s %10s %10s %10s" % ("name", "avail", "hpc", "lat", "long")
-        for site in self.get_sites():
-            print "%20s %10d %10d %10s %10s" % (site.name, len(site.availNodes), len(site.hpcNodes), format_float(site.location.latitude), format_float(site.location.longitude))
-
-        #print "slivers:"
-        #for sliver in self.get_hpc_slivers():
-        #    print "  ", sliver
-
-if __name__=="__main__":
-    x = HpcWizard()
-    x.dump()
-
-    x.increase_slivers("Princeton", 1)
-    x.decrease_slivers("Princeton", 1)
