Merge branch 'master' of github.com:open-cloud/xos
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..774220d
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,94 @@
+FROM       ubuntu:14.04.1
+MAINTAINER Andy Bavier <acb@cs.princeton.edu>
+
+# Install.
+RUN apt-get update
+RUN apt-get install -y git 
+RUN apt-get install -y postgresql
+RUN apt-get install -y python-psycopg2 
+RUN apt-get install -y graphviz graphviz-dev
+RUN apt-get install -y libxslt1.1 libxslt1-dev 
+RUN apt-get install -y python-pip 
+RUN apt-get install -y tar 
+RUN apt-get install -y gcc 
+RUN apt-get install -y python-httplib2 
+RUN apt-get install -y geoip-database libgeoip1
+RUN apt-get install -y wget
+RUN apt-get install -y python-dev
+
+RUN pip install django==1.7
+RUN pip install djangorestframework==2.4.4
+RUN pip install markdown  # Markdown support for the browseable API.
+RUN pip install pyyaml    # YAML content-type support.
+RUN pip install django-filter  # Filtering support
+RUN pip install lxml  # XML manipulation library
+RUN pip install netaddr # IP Addr library
+RUN pip install pytz
+RUN pip install django-timezones
+RUN pip install requests
+RUN pip install django-crispy-forms
+RUN pip install django-geoposition
+RUN pip install django-extensions
+RUN pip install django-suit
+RUN pip install django-evolution
+RUN pip install django-bitfield
+RUN pip install django-ipware
+RUN pip install django-encrypted-fields
+RUN pip install python-keyczar
+
+RUN apt-get install -y python-keystoneclient
+RUN apt-get install -y python-novaclient
+RUN apt-get install -y python-neutronclient 
+RUN apt-get install -y python-glanceclient
+RUN apt-get install -y python-ceilometerclient
+
+RUN pip install django_rest_swagger
+
+RUN apt-get install -y python-setuptools
+RUN easy_install django_evolution
+RUN easy_install python_gflags
+RUN easy_install google_api_python_client
+
+# Set up latest Ansible
+# Need to add our patches too
+RUN apt-get install -y ansible
+# RUN git clone --recursive git://github.com/ansible/ansible.git /opt/ansible
+ADD ansible-hosts /etc/ansible/hosts
+
+ADD http://code.jquery.com/jquery-1.9.1.min.js /usr/local/lib/python2.7/dist-packages/suit/static/suit/js/
+
+# Get XOS 
+ADD planetstack /opt/xos
+
+ADD observer-initscript /etc/init.d/plstackobserver
+
+RUN chmod +x /opt/xos/scripts/opencloud
+RUN /opt/xos/scripts/opencloud genkeys
+
+# Set postgres password to match default value in settings.py
+RUN service postgresql start; sudo -u postgres psql -c "alter user postgres with password 'password';"
+
+# Turn DEBUG on so that devel server will serve static files
+RUN sed -i 's/DEBUG = False/DEBUG = True/' /opt/xos/planetstack/settings.py
+
+# Cruft to workaround problems with migrations, should go away...
+RUN /opt/xos/scripts/opencloud dropdb
+RUN rm -rf /opt/xos/*/migrations
+RUN cd /opt/xos; python ./manage.py makemigrations core
+RUN cd /opt/xos; python ./manage.py makemigrations hpc
+RUN cd /opt/xos; python ./manage.py makemigrations requestrouter
+RUN cd /opt/xos; python ./manage.py makemigrations syndicate_storage
+RUN cd /opt/xos; python ./manage.py makemigrations servcomp
+
+RUN /opt/xos/scripts/opencloud initdb
+
+EXPOSE 8000
+
+# Set environment variables.
+ENV HOME /root
+
+# Define working directory.
+WORKDIR /root
+
+# Define default command.
+CMD ["/bin/bash"]
diff --git a/Makefile b/Makefile
index f6573ca..2b55526 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-NAME = opencloud
+NAME = xos
 SPECFILE = $(NAME).spec
 VERSION = $(shell rpm -q --specfile $(SPECFILE) --qf '%{VERSION}\n' | head -n 1)
 RELEASE = $(shell rpm -q --specfile $(SPECFILE) --qf '%{RELEASE}\n' | head -n 1)
diff --git a/README.Docker b/README.Docker
new file mode 100644
index 0000000..5ce5806
--- /dev/null
+++ b/README.Docker
@@ -0,0 +1,25 @@
+The Dockerfile in this directory will build a Docker image for running
+XOS using the Django development server.  It copies whatever files are 
+in the local repository into the image. Here's how to do it:
+
+1. Currently planetstack/core/fixtures/initial_data.json is broken!
+   Overwrite this file with a working fixture, e.g., by dumping
+   portal.opencloud.us's database:
+
+   $ sudo /opt/xos/scripts/opencloud dumpdata
+
+2. $ docker build -t xos .
+
+3. $ docker run -t -i -p 8000:8000 xos
+
+4. Now you will have a bash prompt as root inside the XOS container.
+   Start up XOS:
+   
+   # /opt/xos/scripts/opencloud runserver
+
+You can access the XOS login at http:<server>:8000, where <server> is
+the name of the server running Docker.
+
+STILL TO DO
+-----------
+* Test Observer
diff --git a/ansible-hosts b/ansible-hosts
new file mode 100644
index 0000000..0dd74f1
--- /dev/null
+++ b/ansible-hosts
@@ -0,0 +1,2 @@
+[localhost]
+127.0.0.1
diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py
index a379302..e03098e 100644
--- a/planetstack/core/admin.py
+++ b/planetstack/core/admin.py
@@ -636,7 +636,7 @@
     suit_form_tabs =(('sites','Deployment Details'),('deploymentprivileges','Privileges'), ('sitedeployments', 'Site Deployments'))
 
     def get_form(self, request, obj=None, **kwargs):
-        if request.user.isReadOnlyUser():
+        if request.user.isReadOnlyUser() or not request.user.is_admin:
             kwargs["form"] = DeploymentAdminROForm
         else:
             kwargs["form"] = DeploymentAdminForm
diff --git a/planetstack/core/dashboard/sites.py b/planetstack/core/dashboard/sites.py
index 3284dae..4a2e742 100644
--- a/planetstack/core/dashboard/sites.py
+++ b/planetstack/core/dashboard/sites.py
@@ -12,7 +12,7 @@
     def get_urls(self):
         """Add our dashboard view to the admin urlconf. Deleted the default index."""
         from django.conf.urls import patterns, url
-        from views import DashboardCustomize, DashboardDynamicView, DashboardWelcomeView, SimulatorView, \
+        from views import DashboardCustomize, DashboardDynamicView, SimulatorView, \
                           DashboardUserSiteView,  \
                           TenantViewData, TenantCreateSlice, TenantAddUser,TenantAddOrRemoveSliverView, TenantPickSitesView, TenantDeleteSliceView, \
                           TenantUpdateSlice, DashboardSliceInteractions, RequestAccessView
@@ -40,7 +40,7 @@
                     name="customize"),
                url(r'^hpcdashuserslices/', self.admin_view(DashboardUserSiteView.as_view()),
                     name="hpcdashuserslices"),
-               url(r'^welcome/$', self.admin_view(DashboardWelcomeView.as_view()),
+               url(r'^welcome/$', self.admin_view(DashboardDynamicView.as_view()),
                     name="welcome"),
                url(r'^simulator/', self.admin_view(SimulatorView.as_view()),
                     name="simulator"),
diff --git a/planetstack/core/dashboard/views/home.py b/planetstack/core/dashboard/views/home.py
index 3084c0e..4270d6d 100644
--- a/planetstack/core/dashboard/views/home.py
+++ b/planetstack/core/dashboard/views/home.py
@@ -1,13 +1,5 @@
 from view_common import *
 
-class DashboardWelcomeView(TemplateView):
-    template_name = 'admin/dashboard/welcome.html'
-
-    def get(self, request, *args, **kwargs):
-        context = self.get_context_data(**kwargs)
-        context = getDashboardContext(request.user, context)
-        return self.render_to_response(context=context)
-
 class DashboardDynamicView(TemplateView):
     head_template = r"""{% extends "admin/dashboard/dashboard_base.html" %}
        {% load admin_static %}
@@ -33,8 +25,8 @@
             return self.singleDashboardView(request, name, context)
 
     def readTemplate(self, fn):
-        TEMPLATE_DIRS = ["/opt/planetstack/templates/admin/dashboard/",
-                         "/opt/planetstack/core/xoslib/dashboards/"]
+        TEMPLATE_DIRS = [XOS_DIR + "/templates/admin/dashboard/",
+                         XOS_DIR + "/core/xoslib/dashboards/"]
 
         for template_dir in TEMPLATE_DIRS:
             pathname = os.path.join(template_dir, fn) + ".html"
diff --git a/planetstack/core/dashboard/views/shell.py b/planetstack/core/dashboard/views/shell.py
index 5efe239..e852b16 100644
--- a/planetstack/core/dashboard/views/shell.py
+++ b/planetstack/core/dashboard/views/shell.py
@@ -1,4 +1,3 @@
-# /opt/planetstack/core/dashboard/views/helloworld.py
 import datetime
 import os
 import sys
diff --git a/planetstack/core/dashboard/views/view_common.py b/planetstack/core/dashboard/views/view_common.py
index 060775d..deb8210 100644
--- a/planetstack/core/dashboard/views/view_common.py
+++ b/planetstack/core/dashboard/views/view_common.py
@@ -18,6 +18,7 @@
 from operator import itemgetter, attrgetter
 import traceback
 import math
+from planetstack.config import Config, XOS_DIR
 
 def getDashboardContext(user, context={}, tableFormat = False):
         context = {}
diff --git a/planetstack/core/middleware.py b/planetstack/core/middleware.py
index 1401cd6..54267e3 100644
--- a/planetstack/core/middleware.py
+++ b/planetstack/core/middleware.py
@@ -4,7 +4,7 @@
 
 def get_request():
     if not hasattr(_active, "request"):
-        raise Exception("Please add 'core.middleware.GlobalRequestMiddleware' to /opt/planetstack/planetstack/settings.py:MIDDLEWARE_CLASSES")
+        raise Exception("Please add 'core.middleware.GlobalRequestMiddleware' to <XOS_DIR>/planetstack/settings.py:MIDDLEWARE_CLASSES")
     return _active.request
 
 class GlobalRequestMiddleware(object):
diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py
index d7787c4..6fcc8fd 100644
--- a/planetstack/core/models/__init__.py
+++ b/planetstack/core/models/__init__.py
@@ -15,13 +15,13 @@
 from .slice import Slice, ControllerSlice
 from .controlleruser import ControllerUser, ControllerSitePrivilege, ControllerSlicePrivilege
 from .image import ImageDeployments, ControllerImages
-from .node import Node
 from .serviceresource import ServiceResource
 from .slice import SliceRole
 from .slice import SlicePrivilege
 from .credential import UserCredential,SiteCredential,SliceCredential
 from .site import SiteRole
 from .site import SitePrivilege
+from .node import Node
 from .planetstackspecific import PlanetStack,PlanetStackRole,PlanetStackPrivilege
 from .slicetag import SliceTag
 from .sliver import Sliver
diff --git a/planetstack/core/models/node.py b/planetstack/core/models/node.py
index 94f93a5..1cd0e40 100644
--- a/planetstack/core/models/node.py
+++ b/planetstack/core/models/node.py
@@ -1,7 +1,7 @@
 import os
 from django.db import models
 from core.models import PlCoreBase
-from core.models import Site, SiteDeployment
+from core.models import Site, SiteDeployment, SitePrivilege
 from core.models import Tag
 from django.contrib.contenttypes import generic
 
@@ -20,3 +20,14 @@
             self.site = self.site_deployment.site
 
         super(Node, self).save(*args, **kwds)
+
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+        if SitePrivilege.objects.filter(
+            user=user, site=self.site, role__role__in=['admin','tech']):
+            return True
+            
+        return False                    
diff --git a/planetstack/core/models/plcorebase.py b/planetstack/core/models/plcorebase.py
index 5217667..c86d675 100644
--- a/planetstack/core/models/plcorebase.py
+++ b/planetstack/core/models/plcorebase.py
@@ -177,7 +177,7 @@
     backend_register = models.CharField(max_length=140,
                                       default="{}", null=True)
 
-    backend_status = models.CharField(max_length=140,
+    backend_status = models.CharField(max_length=1024,
                                       default="0 - Provisioning in progress")
     deleted = models.BooleanField(default=False)
 
diff --git a/planetstack/core/models/site.py b/planetstack/core/models/site.py
index cc2ad03..f368bbe 100644
--- a/planetstack/core/models/site.py
+++ b/planetstack/core/models/site.py
@@ -214,6 +214,17 @@
 
         return Deployment.objects.filter(id__in=ids)
 
+    def can_update(self, user):
+        if user.is_readonly:
+            return False
+        if user.is_admin:
+            return True
+            
+        if self.deploymentprivileges.filter(user=user, role__role='admin'):
+            return True
+          
+        return False    
+          
     def __unicode__(self):  return u'%s' % (self.name)
 
 class DeploymentRole(PlCoreBase):
diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py
index 8dfde4c..476cf8e 100644
--- a/planetstack/core/models/slice.py
+++ b/planetstack/core/models/slice.py
@@ -85,16 +85,16 @@
             return False
         if user.is_admin:
             return True
+        if user == self.creator:
+            return True    
         # slice admins can update
-        slice_privs = SlicePrivilege.objects.filter(user=user, slice=self)
-        for slice_priv in slice_privs:
-            if slice_priv.role.role == 'admin':
-                return True
+        if SlicePrivilege.objects.filter(
+            user=user, slice=self, role__role='admin'):
+            return True
         # site pis can update
-        site_privs = SitePrivilege.objects.filter(user=user, site=self.site)
-        for site_priv in site_privs:
-            if site_priv.role.role == 'pi':
-                return True
+        if SitePrivilege.objects.filter(
+            user=user, site=self.site, role__role__in=['admin', 'pi']):
+            return True
  
         return False
 
diff --git a/planetstack/core/models/user.py b/planetstack/core/models/user.py
index 26a77f2..60fd290 100644
--- a/planetstack/core/models/user.py
+++ b/planetstack/core/models/user.py
@@ -171,7 +171,7 @@
     updated = models.DateTimeField(auto_now=True)
     enacted = models.DateTimeField(null=True, default=None)
     policed = models.DateTimeField(null=True, default=None)
-    backend_status = models.CharField(max_length=140,
+    backend_status = models.CharField(max_length=1024,
                                       default="Provisioning in progress")
     deleted = models.BooleanField(default=False)
 
diff --git a/planetstack/core/tests.py b/planetstack/core/tests.py
index 1c490c8..d07069a 100644
--- a/planetstack/core/tests.py
+++ b/planetstack/core/tests.py
@@ -69,7 +69,7 @@
 
 
 	def create(self, model, mplural, record):
-		request = self.client.put('/plstackapi/%s/'%mplural,record['fields'])
+		request = self.client.put('/xos/%s/'%mplural,record['fields'])
 
 		#if (len2==len1):
 		#	raise Exception('Could not delete %s/%d'%(model,pk))
@@ -81,7 +81,7 @@
 		record_to_update = src_record['fields']
 		now = datetime.now()
 		record_to_update['enacted']=now
-		response = self.client.put('/plstackapi/%s/%d/'%(mplural,pk),record_to_update)
+		response = self.client.put('/xos/%s/%d/'%(mplural,pk),record_to_update)
 		self.assertEqual(response.data['enacted'],now)
 
 		return
@@ -89,14 +89,14 @@
 	def delete(self, model, mplural, pk):
 		mclass = globals()[model]
 		len1 = len(mclass.objects.all())
-		response = self.client.delete('/plstackapi/%s/%d/'%(mplural,pk))
+		response = self.client.delete('/xos/%s/%d/'%(mplural,pk))
 		len2 = len(mclass.objects.all())
 		self.assertNotEqual(len1,len2)
 
 		return
 
 	def retrieve(self, m, mplural, mlower):
-		response = self.client.get('/plstackapi/%s/'%mplural)
+		response = self.client.get('/xos/%s/'%mplural)
 		#force_authenticate(request,user=self.calling_user)
 		self.check_items(response.data,self.data_dict[mlower])
 
diff --git a/planetstack/core/views/legacyapi.py b/planetstack/core/views/legacyapi.py
index 31471ad..978fd21 100644
--- a/planetstack/core/views/legacyapi.py
+++ b/planetstack/core/views/legacyapi.py
@@ -6,10 +6,6 @@
 import traceback
 import xmlrpclib
 
-#  XXX for testing
-#sys.path.append("/opt/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
 
 from django.http import HttpResponse
diff --git a/planetstack/core/views/observer.py b/planetstack/core/views/observer.py
index 67b2fde..2912db9 100644
--- a/planetstack/core/views/observer.py
+++ b/planetstack/core/views/observer.py
@@ -2,11 +2,15 @@
 from monitor import driver
 from core.models import *
 import json
+import os
 import time
 
 def Observer(request):
+    if not os.path.exists('/tmp/observer_last_run'):
+        return HttpResponse(json.dumps({"health": ":-X", "time": time.time(), "comp": 0}))
+
     t = time.time()
-    status_str = open('/tmp/observer_last_run','r').read()    
+    status_str = open('/tmp/observer_last_run','r').read()
     d = json.loads(status_str)
     comp = d['last_run'] + d['last_duration']*2 + 300
     if comp>t:
diff --git a/planetstack/core/xoslib/README b/planetstack/core/xoslib/README
index a5af121..6d69629 100644
--- a/planetstack/core/xoslib/README
+++ b/planetstack/core/xoslib/README
@@ -1,7 +1,7 @@
 Add to the following in settings.py
 
     STATICFILES_DIRS=
-	"/opt/planetstack/core/xoslib/static/",
+	XOS_DIR + "/core/xoslib/static/",
 
     TEMPLATE_DIRS=
-        "/opt/planetstack/xoslib/templates",
\ No newline at end of file
+        XOS_DIR + "/xoslib/templates",
\ No newline at end of file
diff --git a/planetstack/core/xoslib/dashboards/helloworld.html b/planetstack/core/xoslib/dashboards/helloworld.html
index 48badb6..91dde39 100644
--- a/planetstack/core/xoslib/dashboards/helloworld.html
+++ b/planetstack/core/xoslib/dashboards/helloworld.html
@@ -1,4 +1,4 @@
-<!-- /opt/planetstack/templates/admin/dashboard/helloworld.html -->
+<!-- /opt/xos/templates/admin/dashboard/helloworld.html -->
 <div>Hello, {{ user.firstname }} {{ user.lastname }}.</div>
 <div>This is the hello world view. The value of foobar is {{ foobar }}.</div>
 <div id="dynamicTableOfInterestingThings"></div>
diff --git a/planetstack/core/xoslib/tools/make_defaults.py b/planetstack/core/xoslib/tools/make_defaults.py
index ad5377c..04fccc0 100644
--- a/planetstack/core/xoslib/tools/make_defaults.py
+++ b/planetstack/core/xoslib/tools/make_defaults.py
@@ -1,7 +1,8 @@
 import os
 import sys
-os.chdir("/opt/planetstack")
-sys.path.append("/opt/planetstack")
+XOS_DIR="/opt/xos"
+os.chdir(XOS_DIR)
+sys.path.append(XOS_DIR)
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 import django
 import core.models
diff --git a/planetstack/core/xoslib/tools/make_validators.py b/planetstack/core/xoslib/tools/make_validators.py
index 0fca367..f627457 100644
--- a/planetstack/core/xoslib/tools/make_validators.py
+++ b/planetstack/core/xoslib/tools/make_validators.py
@@ -1,7 +1,8 @@
 import os
 import sys
-os.chdir("/opt/planetstack")
-sys.path.append("/opt/planetstack")
+XOS_DIR="/opt/xos"
+os.chdir(XOS_DIR)
+sys.path.append(XOS_DIR)
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 import django
 import core.models
diff --git a/planetstack/dependency_walker.py b/planetstack/dependency_walker.py
index 8b15a85..6120d7d 100644
--- a/planetstack/dependency_walker.py
+++ b/planetstack/dependency_walker.py
@@ -2,7 +2,7 @@
 
 import os
 import imp
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 import inspect
 import time
 import traceback
@@ -13,14 +13,14 @@
 from core.models import *
 
 from util.logger import Logger, logging
-logger = Logger(level=logging.INFO)

+logger = Logger(level=logging.INFO)
 
 missing_links={}
 
 try:
 	dep_data = open(Config().dependency_graph).read()
 except:
-	dep_data = open('/opt/planetstack/model-deps').read()
+	dep_data = open(XOS_DIR + '/model-deps').read()
 
 dependencies = json.loads(dep_data)
 
diff --git a/planetstack/ec2_observer/event_loop.py b/planetstack/ec2_observer/event_loop.py
index 1319fec..fb5f973 100644
--- a/planetstack/ec2_observer/event_loop.py
+++ b/planetstack/ec2_observer/event_loop.py
@@ -16,7 +16,7 @@
 from openstack.driver import OpenStackDriver
 from util.logger import Logger, logging, logger
 #from timeout import timeout
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 from observer.steps import *
 from syncstep import SyncStep
 from toposort import toposort
@@ -82,7 +82,7 @@
 			if hasattr(Config(), "observer_steps_dir"):
 				step_dir = Config().observer_steps_dir
 			else:
-				step_dir = "/opt/planetstack/observer/steps"
+				step_dir = XOS_DIR + "/observer/steps"
 
 		for fn in os.listdir(step_dir):
 			pathname = os.path.join(step_dir,fn)
@@ -336,7 +336,7 @@
 
 		while True:
 			try:
-				error_map_file = getattr(Config(), "error_map_path", "/opt/planetstack/error_map.txt")
+				error_map_file = getattr(Config(), "error_map_path", XOS_DIR + "/error_map.txt")
 				self.error_mapper = ErrorMapper(error_map_file)
 
 				# Set of whole steps that failed
diff --git a/planetstack/ec2_observer/event_manager.py b/planetstack/ec2_observer/event_manager.py
index 97454ec..190d4eb 100644
--- a/planetstack/ec2_observer/event_manager.py
+++ b/planetstack/ec2_observer/event_manager.py
@@ -1,7 +1,7 @@
 import threading
 import requests, json
 
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 
 import uuid
 import os
@@ -16,13 +16,13 @@
 def get_random_client_id():
     global random_client_id
 
-    if (random_client_id is None) and os.path.exists("/opt/planetstack/random_client_id"):
+    if (random_client_id is None) and os.path.exists(XOS_DIR + "/random_client_id"):
         # try to use the last one we used, if we saved it
         try:
-            random_client_id = open("/opt/planetstack/random_client_id","r").readline().strip()
+            random_client_id = open(XOS_DIR+"/random_client_id","r").readline().strip()
             print "get_random_client_id: loaded %s" % random_client_id
         except:
-            print "get_random_client_id: failed to read /opt/planetstack/random_client_id"
+            print "get_random_client_id: failed to read " + XOS_DIR + "/random_client_id"
 
     if random_client_id is None:
         random_client_id = base64.urlsafe_b64encode(os.urandom(12))
@@ -30,9 +30,9 @@
 
         # try to save it for later (XXX: could race with another client here)
         try:
-            open("/opt/planetstack/random_client_id","w").write("%s\n" % random_client_id)
+            open(XOS_DIR + "/random_client_id","w").write("%s\n" % random_client_id)
         except:
-            print "get_random_client_id: failed to write /opt/planetstack/random_client_id"
+            print "get_random_client_id: failed to write " + XOS_DIR + "/random_client_id"
 
     return random_client_id
 
diff --git a/planetstack/ec2_observer/steps/sync_images.py b/planetstack/ec2_observer/steps/sync_images.py
index 903b73b..b494c06 100644
--- a/planetstack/ec2_observer/steps/sync_images.py
+++ b/planetstack/ec2_observer/steps/sync_images.py
@@ -1,7 +1,7 @@
 import os
 import base64
 from django.db.models import F, Q
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 from ec2_observer.syncstep import SyncStep
 from core.models.image import Image
 from ec2_observer.awslib import *
@@ -21,10 +21,10 @@
         new_images = []
 
         try:
-            aws_images = json.loads(open('/opt/planetstack/aws-images').read())
+            aws_images = json.loads(open(XOS_DIR + '/aws-images').read())
         except:
             aws_images = aws_run('ec2 describe-images --owner 099720109477')
-            open('/opt/planetstack/aws-images','w').write(json.dumps(aws_images))
+            open(XOS_DIR + '/aws-images','w').write(json.dumps(aws_images))
 
         
 
diff --git a/planetstack/hpc_observer/hpc_observer_config b/planetstack/hpc_observer/hpc_observer_config
index 0b010cd..3878336 100644
--- a/planetstack/hpc_observer/hpc_observer_config
+++ b/planetstack/hpc_observer/hpc_observer_config
@@ -22,9 +22,9 @@
 nova_enabled=True
 
 [observer]
-dependency_graph=/opt/planetstack/hpc_observer/model-deps
-steps_dir=/opt/planetstack/hpc_observer/steps
-deleters_dir=/opt/planetstack/hpc_observer/deleters
+dependency_graph=/opt/xos/hpc_observer/model-deps
+steps_dir=/opt/xos/hpc_observer/steps
+deleters_dir=/opt/xos/hpc_observer/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/planetstack/hpc_wizard/bigquery_analytics.py b/planetstack/hpc_wizard/bigquery_analytics.py
index 4a90c2b..cb3038a 100644
--- a/planetstack/hpc_wizard/bigquery_analytics.py
+++ b/planetstack/hpc_wizard/bigquery_analytics.py
@@ -18,6 +18,8 @@
 from oauth2client.file import Storage
 from oauth2client.tools import run_flow,run
 
+from bigquery_config import BIGQUERY_SECRETS_FN, BIGQUERY_CREDENTIALS_FN
+
 """
 yum -y install python-httplib2
 easy_install python_gflags
@@ -27,7 +29,7 @@
 PROJECT_NUMBER = '549187599759'
 
 try:
-    FLOW = flow_from_clientsecrets('/opt/planetstack/hpc_wizard/client_secrets.json',
+    FLOW = flow_from_clientsecrets(BIGQUERY_SECRETS_FN,
                                    scope='https://www.googleapis.com/auth/bigquery')
     BIGQUERY_AVAILABLE = True
 except:
@@ -92,7 +94,7 @@
         except:
             pass
 
-	storage = Storage('/opt/planetstack/hpc_wizard/bigquery_credentials.dat')
+	storage = Storage(BIGQUERY_CREDENTIALS_FN)
  	credentials = storage.get()
 
 	if credentials is None or credentials.invalid:
diff --git a/planetstack/hpc_wizard/bigquery_config.py b/planetstack/hpc_wizard/bigquery_config.py
new file mode 100644
index 0000000..345acf2
--- /dev/null
+++ b/planetstack/hpc_wizard/bigquery_config.py
@@ -0,0 +1,3 @@
+BIGQUERY_DIR = "/opt/xos"
+BIGQUERY_SECRETS_FN = os.path.join(BIGQUERY_DIR, "hpc_wizard/client_secrets.json")
+BIGQUERY_CREDENTIALS_FN = os.path.join(BIGQUERY_DIR, "hpc_wizard/bigquery_credentials.dat")
diff --git a/planetstack/hpc_wizard/planetstack_analytics.py b/planetstack/hpc_wizard/planetstack_analytics.py
index 75462d4..06a083b 100644
--- a/planetstack/hpc_wizard/planetstack_analytics.py
+++ b/planetstack/hpc_wizard/planetstack_analytics.py
@@ -8,10 +8,8 @@
 import traceback
 import urllib2
 
-if os.path.exists("/home/smbaker/projects/vicci/plstackapi/planetstack"):
-    sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
-else:
-    sys.path.append("/opt/planetstack")
+# XXX hardcoded path
+sys.path.append("/opt/xos")
 
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 from django.conf import settings
diff --git a/planetstack/hpc_wizard/query.py b/planetstack/hpc_wizard/query.py
index 4ddf4f6..874022e 100644
--- a/planetstack/hpc_wizard/query.py
+++ b/planetstack/hpc_wizard/query.py
@@ -17,6 +17,8 @@
 from oauth2client.file import Storage
 from oauth2client.tools import run_flow,run
 
+from bigquery_config import BIGQUERY_SECRETS_FN, BIGQUERY_CREDENTIALS_FN
+
 """
 yum -y install python-httplib2
 easy_install python_gflags
@@ -27,7 +29,7 @@
 PROJECT_NUMBER = '549187599759'
 
 try:
-    FLOW = flow_from_clientsecrets('/opt/planetstack/hpc_wizard/client_secrets.json',
+    FLOW = flow_from_clientsecrets(BIGQUERY_SECRETS_FN,
                                    scope='https://www.googleapis.com/auth/bigquery')
 except:
     print "exception while initializing bigquery flow"
@@ -60,7 +62,7 @@
         return resp
 
     def run_query(self, query):
-	storage = Storage('/opt/planetstack/hpc_wizard/bigquery_credentials.dat')
+	storage = Storage(BIGQUERY_CREDENTIALS_FN)
  	credentials = storage.get()
 
 	if credentials is None or credentials.invalid:
diff --git a/planetstack/openstack_observer/ansible.py b/planetstack/openstack_observer/ansible.py
index 41dc6f0..e5ce780 100644
--- a/planetstack/openstack_observer/ansible.py
+++ b/planetstack/openstack_observer/ansible.py
@@ -8,11 +8,15 @@
 import random
 import re
 
+# XXX hardcoded path
+#    is there any reason why we aren't importing planetstack.config ?
+XOS_DIR="/opt/xos"
+
 try:
     step_dir = Config().observer_steps_dir
     sys_dir = Config().observer_sys_dir
 except:
-    step_dir = '/opt/planetstack/observer/steps'
+    step_dir = XOS_DIR + '/observer/steps'
     sys_dir = '/opt/opencloud'
 
 os_template_loader = jinja2.FileSystemLoader( searchpath=step_dir)
@@ -63,7 +67,7 @@
     f.write(buffer)
     f.flush()
 
-    run = os.popen('/opt/planetstack/observer/run_ansible %s'%shellquote(fqp))
+    run = os.popen(XOS_DIR + '/observer/run_ansible %s'%shellquote(fqp))
     #run = os.popen('ansible-playbook -v %s'%shellquote(fqp))
     msg = run.read()
     status = run.close()
diff --git a/planetstack/openstack_observer/event_loop.py b/planetstack/openstack_observer/event_loop.py
index bc0b226..ce0ab5e 100644
--- a/planetstack/openstack_observer/event_loop.py
+++ b/planetstack/openstack_observer/event_loop.py
@@ -20,7 +20,7 @@
 from openstack.driver import OpenStackDriver
 from util.logger import Logger, logging, logger
 #from timeout import timeout
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 from observer.steps import *
 from syncstep import SyncStep
 from toposort import toposort
@@ -98,7 +98,7 @@
 			if hasattr(Config(), "observer_steps_dir"):
 				step_dir = Config().observer_steps_dir
 			else:
-				step_dir = "/opt/planetstack/observer/steps"
+				step_dir = XOS_DIR + "/observer/steps"
 
 		for fn in os.listdir(step_dir):
 			pathname = os.path.join(step_dir,fn)
@@ -380,7 +380,7 @@
 		while True:
 			try:
 				loop_start = time.time()
-				error_map_file = getattr(Config(), "error_map_path", "/opt/planetstack/error_map.txt")
+				error_map_file = getattr(Config(), "error_map_path", XOS_DIR + "/error_map.txt")
 				self.error_mapper = ErrorMapper(error_map_file)
 
 				# Set of whole steps that failed
diff --git a/planetstack/openstack_observer/event_manager.py b/planetstack/openstack_observer/event_manager.py
index 97454ec..190d4eb 100644
--- a/planetstack/openstack_observer/event_manager.py
+++ b/planetstack/openstack_observer/event_manager.py
@@ -1,7 +1,7 @@
 import threading
 import requests, json
 
-from planetstack.config import Config
+from planetstack.config import Config, XOS_DIR
 
 import uuid
 import os
@@ -16,13 +16,13 @@
 def get_random_client_id():
     global random_client_id
 
-    if (random_client_id is None) and os.path.exists("/opt/planetstack/random_client_id"):
+    if (random_client_id is None) and os.path.exists(XOS_DIR + "/random_client_id"):
         # try to use the last one we used, if we saved it
         try:
-            random_client_id = open("/opt/planetstack/random_client_id","r").readline().strip()
+            random_client_id = open(XOS_DIR+"/random_client_id","r").readline().strip()
             print "get_random_client_id: loaded %s" % random_client_id
         except:
-            print "get_random_client_id: failed to read /opt/planetstack/random_client_id"
+            print "get_random_client_id: failed to read " + XOS_DIR + "/random_client_id"
 
     if random_client_id is None:
         random_client_id = base64.urlsafe_b64encode(os.urandom(12))
@@ -30,9 +30,9 @@
 
         # try to save it for later (XXX: could race with another client here)
         try:
-            open("/opt/planetstack/random_client_id","w").write("%s\n" % random_client_id)
+            open(XOS_DIR + "/random_client_id","w").write("%s\n" % random_client_id)
         except:
-            print "get_random_client_id: failed to write /opt/planetstack/random_client_id"
+            print "get_random_client_id: failed to write " + XOS_DIR + "/random_client_id"
 
     return random_client_id
 
diff --git a/planetstack/planetstack/config.py b/planetstack/planetstack/config.py
index 923964d..cb2e33f 100644
--- a/planetstack/planetstack/config.py
+++ b/planetstack/planetstack/config.py
@@ -12,8 +12,8 @@
 """
 """
 
-XOS_ROOT = "/opt/planetstack"
-DEFAULT_CONFIG_FN = os.path.join(XOS_ROOT, "xos_config")
+XOS_DIR = "/opt/xos"
+DEFAULT_CONFIG_FN = os.path.join(XOS_DIR, "xos_config")
 
 # warning for now, remove once we're sure everyone has made the change
 if (os.path.exists("/opt/planetstack/plstackapi_config") and (not os.path.exists(DEFAULT_CONFIG_FN))):
diff --git a/planetstack/planetstack/settings.py b/planetstack/planetstack/settings.py
index 19bf9e8..cae61aa 100644
--- a/planetstack/planetstack/settings.py
+++ b/planetstack/planetstack/settings.py
@@ -6,8 +6,9 @@
 config = Config()
 
 GEOIP_PATH = "/usr/share/GeoIP"
+XOS_DIR = "/opt/xos"
  
-DEBUG = True
+DEBUG = False 
 TEMPLATE_DEBUG = DEBUG
 
 ADMINS = (
@@ -35,7 +36,7 @@
 
 # Hosts/domain names that are valid for this site; required if DEBUG is False
 # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
-ALLOWED_HOSTS = []
+ALLOWED_HOSTS = ["*"]
 
 # Local time zone for this installation. Choices can be found here:
 # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
@@ -80,11 +81,8 @@
 STATIC_URL = '/static/'
 
 # Additional locations of static files
-STATICFILES_DIRS = ( "/opt/planetstack/core/static/",
-                     "/opt/planetstack/core/xoslib/static/",
-    # Put strings here, like "/home/html/static" or "C:/www/django/static".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
+STATICFILES_DIRS = ( XOS_DIR + "/core/static/",
+                     XOS_DIR + "/core/xoslib/static/",
 )
 
 # List of finder classes that know how to find static files in
@@ -125,8 +123,8 @@
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
-    "/opt/planetstack/templates",
-    "/opt/planetstack/core/xoslib/templates",    
+    XOS_DIR + "/templates",
+    XOS_DIR + "/core/xoslib/templates",    
 )
 
 INSTALLED_APPS = (
@@ -261,7 +259,7 @@
 BIGQUERY_TABLE = getattr(config, "bigquery_table", "demoevents")
 
 DISABLE_MINIDASHBOARD = getattr(config, "gui_disable_minidashboard", False)
-ENCRYPTED_FIELDS_KEYDIR = '/opt/planetstack/private_keys'
+ENCRYPTED_FIELDS_KEYDIR = XOS_DIR + '/private_keys'
 ENCRYPTED_FIELD_MODE = 'ENCRYPT'
 
 STATISTICS_DRIVER = getattr(config, "statistics_driver", "ceilometer")
diff --git a/planetstack/redhat/planetstack-backend.service b/planetstack/redhat/planetstack-backend.service
index 90d3c7c..43734f1 100644
--- a/planetstack/redhat/planetstack-backend.service
+++ b/planetstack/redhat/planetstack-backend.service
@@ -1,13 +1,13 @@
 [Unit]
-Description=PlanetStack Observer
+Description=XOS Observer
 After=syslog.target network.target
 
 [Service]
 Type=forking
 User=root
-PIDFile=/var/run/planetstack-backend.pid
-ExecStart=/usr/sbin/daemonize -c /opt/planetstack -p /var/run/planetstack-backend.pid /opt/planetstack/planetstack-backend.py
-ExecStop=kill $(cat /var/run/planetstack-backend.pid)
+PIDFile=/var/run/xos-observer.pid
+ExecStart=/usr/sbin/daemonize -c /opt/xos -p /var/run/xos-observer.pid /opt/xos/xos-observer.py
+ExecStop=kill $(cat /var/run/xos-observer.pid)
 
 [Install]
 WantedBy=multi-user.target
diff --git a/planetstack/rr_observer/rr_observer_config b/planetstack/rr_observer/rr_observer_config
index 1fb52d0..af4ed1a 100644
--- a/planetstack/rr_observer/rr_observer_config
+++ b/planetstack/rr_observer/rr_observer_config
@@ -24,9 +24,9 @@
 nova_enabled=True
 
 [observer]
-dependency_graph=/opt/planetstack/rr_observer/model-deps
-steps_dir=/opt/planetstack/rr_observer/steps
-deleters_dir=/opt/planetstack/rr_observer/deleters
+dependency_graph=/opt/xos/rr_observer/model-deps
+steps_dir=/opt/xos/rr_observer/steps
+deleters_dir=/opt/xos/rr_observer/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/planetstack/scripts/opencloud b/planetstack/scripts/opencloud
old mode 100644
new mode 100755
index 54852b9..d460312
--- a/planetstack/scripts/opencloud
+++ b/planetstack/scripts/opencloud
@@ -1,15 +1,17 @@
-#!/bin/sh
+#!/bin/bash
 
 if [ -z "$1" ]; then
     echo usage: $0 "[initdb | createdb | dropdb | syncdb | runserver | resetdb | dumpdata]"
     exit
 fi
 
-BACKUP_DIR=/opt/planetstack_backups
+XOS_DIR=/opt/xos
+BACKUP_DIR=/opt/xos_backups
+DBNAME=planetstack
 
 DJANGO_17=`python -c "import django; from distutils.version import StrictVersion; print int(StrictVersion(django.get_version()) >= StrictVersion('1.7'))"`
 
-cd /opt/planetstack
+cd $XOS_DIR
 
 function ensure_postgres_running {
     # "sudo -u postgres pg_ctl -D /var/lib/postgres/data status" doesn't work
@@ -22,9 +24,8 @@
         return
     fi
 
-    /sbin/service postgresql initdb
-    /sbin/service postgresql start
-    /sbin/chkconfig postgresql on
+    service postgresql initdb
+    service postgresql start
 
     netstat -nl | grep -i ":5432 "
     if [[ $? != 0 ]]; then
@@ -36,37 +37,38 @@
 
 }
 function createdb {
-    echo "Creating OpenCloud database..."
-    sudo -u postgres createdb planetstack
+    echo "Creating XOS database..."
+    sudo -u postgres createdb $DBNAME
 }
 function dropdb {
-    echo "Dropping OpenCloud database..."
-    sudo -u postgres dropdb planetstack
+    echo "Dropping XOS database..."
+    sudo -u postgres dropdb $DBNAME
 }
 function syncdb {
-    echo "Syncing OpenCloud services..."
-    python /opt/planetstack/manage.py syncdb --noinput
+    echo "Syncing XOS services..."
+    python $XOS_DIR/manage.py syncdb --noinput
     if [[ $DJANGO_17 ]]; then
         echo "Loading initial data from fixture..."
-        python /opt/planetstack/manage.py --noobserver --nomodelpolicy loaddata /opt/planetstack/core/fixtures/initial_data.json
+        python $XOS_DIR/manage.py --noobserver --nomodelpolicy loaddata $XOS_DIR/core/fixtures/initial_data.json
     fi
 }
 function evolvedb {
-    echo "Evolving OpenCloud services..."
-    python /opt/planetstack/manage.py evolve --hint --execute --noinput
+    echo "Evolving XOS services..."
+    python $XOS_DIR/manage.py evolve --hint --execute --noinput
 }
 function migratedb {
-    echo "Migrating OpenCloud services..."
-    python /opt/planetstack/manage.py migrate
+    echo "Migrating XOS services..."
+    python $XOS_DIR/manage.py migrate
 }
 function stopserver {
-    echo "Stopping any running OpenCloud Service(s)"
+    echo "Stopping any running XOS Service(s)"
     pkill -f "python.*runserver"
 }
 function runserver {
-    PUBLIC_HOSTNAME=`/opt/planetstack/planetstack-config.py get server_hostname $HOSTNAME`
-    echo "Starting OpenCloud Service on $PUBLIC_HOSTNAME:8000"
-    python manage.py runserver  $PUBLIC_HOSTNAME:8000&
+    ensure_postgres_running
+    PUBLIC_HOSTNAME=`$XOS_DIR/xos-config.py get server_hostname $HOSTNAME`
+    echo "Starting XOS Service on $PUBLIC_HOSTNAME:8000"
+    python manage.py runserver $PUBLIC_HOSTNAME:8000 --insecure&
 }
 
 function dumpdata {
@@ -115,8 +117,8 @@
     dumpdata
     # TODO: This is where we could run migration scripts to upgrade the
     #   dumped data to the new models.
-    mv /opt/planetstack/core/fixtures/initial_data.json /opt/planetstack/core/fixtures/initial_data.json-old
-    cp $BACKUP_DIR/dumpdata-latest.json /opt/planetstack/core/fixtures/initial_data.json
+    mv $XOS_DIR/core/fixtures/initial_data.json $XOS_DIR/core/fixtures/initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/initial_data.json
     dropdb
     createdb
     syncdb
@@ -128,8 +130,8 @@
     fi
     stopserver
     ensure_postgres_running
-    mv /opt/planetstack/core/fixtures/initial_data.json /opt/planetstack/core/fixtures/initial_data.json-old
-    cp $BACKUP_DIR/dumpdata-latest.json /opt/planetstack/core/fixtures/initial_data.json
+    mv $XOS_DIR/core/fixtures/initial_data.json $XOS_DIR/core/fixtures/initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/initial_data.json
     dropdb
     createdb
     syncdb
diff --git a/planetstack/syndicate_observer/syndicate_observer_config b/planetstack/syndicate_observer/syndicate_observer_config
index 6da1aa0..b83fa89 100644
--- a/planetstack/syndicate_observer/syndicate_observer_config
+++ b/planetstack/syndicate_observer/syndicate_observer_config
@@ -24,9 +24,9 @@
 nova_enabled=True
 
 [observer]
-dependency_graph=/opt/planetstack/syndicate_observer/model-deps
-steps_dir=/opt/planetstack/syndicate_observer/steps
-deleters_dir=/opt/planetstack/syndicate_observer/deleters
+dependency_graph=/opt/xos/syndicate_observer/model-deps
+steps_dir=/opt/xos/syndicate_observer/steps
+deleters_dir=/opt/xos/syndicate_observer/deleters
 log_file=console
 driver=None
 
diff --git a/planetstack/templates/admin/base.html b/planetstack/templates/admin/base.html
index 2d00343..29823a5 100644
--- a/planetstack/templates/admin/base.html
+++ b/planetstack/templates/admin/base.html
@@ -117,7 +117,7 @@
 
             {% if not is_popup %}
             <div id=openCloudTopPage>
-            {% include "/opt/planetstack/templates/admin/newminidashboard.html" %}
+            {% include "admin/newminidashboard.html" %}
             </div>
 
               {% block breadcrumbs %}
diff --git a/planetstack/templates/admin/dashboard/welcome.html b/planetstack/templates/admin/dashboard/welcome.html
deleted file mode 100644
index 0f616e5..0000000
--- a/planetstack/templates/admin/dashboard/welcome.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% extends "admin/dashboard/dashboard_base.html" %}
-{% load admin_static %}
-
-{% block content %}
-<!-- <div id="hometabs" class="inner-center-column ui-tabs ui-widget ui-widget-content ui-corner-all"> -->
-<div id="hometabs" >
-  <ul id="suit_form_tabs" class="nav nav-tabs nav-tabs-suit" data-tab-prefix="suit-tab">
-    <li><a href="#tabs-1">Developer View</a></li>
-    <li><a href="#tabs-2">CDN Operations </a></li>
-    <li><a href="#tabs-3">Historical</a></li>
-    <li><a href="#tabs-4">Slice Interactions</a></li>
-    <li><a href="#tabs-5">Tenant</a></li>
-  </ul>
-<div id="tabs-1">
-{% include "/opt/planetstack/templates/admin/dashboard/developer.html" %}
-</div>
-<div id="tabs-2">
-{% include "/opt/planetstack/templates/admin/dashboard/cdnoperations.html" %}
-</div>
-<div id="tabs-3">
-{% include "/opt/planetstack/templates/admin/dashboard/hpc_historical.html" %}
-</div>
-<div id="tabs-4">
-{% include "/opt/planetstack/templates/admin/dashboard/slice_interactions.html" %}
-</div>
-<div id="tabs-5">
-{% include "/opt/planetstack/templates/admin/dashboard/tenant.html" %}
-</div>
-</div>
-
-{% endblock %}
diff --git a/planetstack/tests/generate_billing_sample.py b/planetstack/tests/generate_billing_sample.py
index b1413e3..fd6d1ea 100644
--- a/planetstack/tests/generate_billing_sample.py
+++ b/planetstack/tests/generate_billing_sample.py
@@ -20,9 +20,8 @@
 DAY_SECONDS = HOUR_SECONDS * 24
 MONTH_SECONDS = DAY_SECONDS * 30
 
-
+# XXX hardcoded path
 sys.path.append("/opt/planetstack")
-#sys.path.append("/home/smbaker/projects/vicci/plstackapi/planetstack")
 
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
 #from openstack.manager import OpenStackManager
diff --git a/planetstack/tests/useraccesstest.py b/planetstack/tests/useraccesstest.py
index 290d7cf..9a32612 100644
--- a/planetstack/tests/useraccesstest.py
+++ b/planetstack/tests/useraccesstest.py
@@ -16,7 +16,7 @@
 
 from operator import itemgetter, attrgetter
 
-REST_API="http://node43.princeton.vicci.org:8000/plstackapi/"
+REST_API="http://node43.princeton.vicci.org:8000/xos/"
 USERS_API = REST_API + "users/"
 SLICES_API = REST_API + "slices/"
 SITES_API = REST_API + "sites/"
diff --git a/planetstack/tests/usertest.py b/planetstack/tests/usertest.py
index 1b5c41b..d096683 100644
--- a/planetstack/tests/usertest.py
+++ b/planetstack/tests/usertest.py
@@ -5,7 +5,7 @@
 
 from operator import itemgetter, attrgetter
 
-REST_API="http://node43.princeton.vicci.org:8000/plstackapi/"
+REST_API="http://node43.princeton.vicci.org:8000/xos/"
 USERS_API = REST_API + "users/"
 
 username = sys.argv[1]
diff --git a/planetstack/tools/init-xos.py b/planetstack/tools/init-xos.py
new file mode 100644
index 0000000..47f5529
--- /dev/null
+++ b/planetstack/tools/init-xos.py
@@ -0,0 +1,57 @@
+import os
+import sys
+sys.path.append("/opt/xos")
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings")
+import django
+from core.models import *
+django.setup()
+
+# python  ./manage.py sqlflush | python ./manage.py dbshell
+
+os.system("python /opt/xos/manage.py sqlflush | python /opt/xos/manage.py dbshell")
+
+ADMIN_USERNAME = "padmin@vicci.org"
+ADMIN_PASSWORD = "letmein"
+FLAVORS = ["m1.small", "m1.medium", "m1.large"]
+SITE_ROLES = ["admin", "pi", "tech"]
+SLICE_ROLES = ["admin", "access"]
+DEPLOYMENT_ROLES = ["admin"]
+
+d = Deployment(name="Enterprise")
+d.save()
+
+s = Site(name="MySite", enabled=True, login_base="mysite", is_public=True, abbreviated_name="mysite")
+s.save()
+
+sd = SiteDeployment(site=s, deployment=d)
+sd.save();
+
+u = User(email = "padmin@vicci.org", password="letmein", is_admin=True, is_active=True, site=s, firstname="XOS",
+         lastname="admin")
+u.save()
+
+for flavor_name in FLAVORS:
+    f = Flavor(name=flavor_name, flavor=flavor_name)
+    f.save()
+    f.deployments.add(d)
+    f.save()
+
+for site_role_name in SITE_ROLES:
+    sr = SiteRole(role=site_role_name)
+    sr.save()
+
+for slice_role_name in SLICE_ROLES:
+    sr = SliceRole(role=slice_role_name)
+    sr.save()
+
+for deployment_role_name in DEPLOYMENT_ROLES:
+    dr = DeploymentRole(role=deployment_role_name)
+    dr.save()
+
+DashboardView(name="xsh", url="template:xsh", enabled=True).save()
+DashboardView(name="Customize", url="template:customize", enabled=True).save()
+DashboardView(name="Tenant", url="template:xosTenant", enabled=True).save()
+DashboardView(name="Developer", url="template:xosDeveloper_datatables", enabled=True).save()
+
+ServiceClass(name="Best Effort", description="Best Effort").save()
+
diff --git a/planetstack/tools/openstack-db-cleanup.sh b/planetstack/tools/openstack-db-cleanup.sh
index 9baca6e..851d326 100644
--- a/planetstack/tools/openstack-db-cleanup.sh
+++ b/planetstack/tools/openstack-db-cleanup.sh
@@ -1,11 +1,13 @@
 #! /bin/bash
 
 # to install
-#    chmod 0755 /opt/planetstack/openstack/openstack-db-cleanup.sh
-#    ln -s /opt/planetstack/openstack/openstack-db-cleanup.sh /etc/cron.daily/openstack-db-cleanup.cron
+#    chmod 0755 /opt/xos/openstack/openstack-db-cleanup.sh
+#    ln -s /opt/xos/openstack/openstack-db-cleanup.sh /etc/cron.daily/openstack-db-cleanup.cron
 
-mkdir -p /opt/planetstack/ovs-backups
-BACKUP_NAME=/opt/planetstack/ovs-backups/backup-`date "+%Y-%M-%d"`.sql
+XOS_DIR="/opt/xos"
+
+mkdir -p $XOS_DIR/ovs-backups
+BACKUP_NAME=$XOS_DIR/ovs-backups/backup-`date "+%Y-%M-%d"`.sql
 mysqldump --create-options --routines --triggers --databases keystone ovs_quantum nova glance cinder > $BACKUP_NAME
 gzip $BACKUP_NAME
 
diff --git a/planetstack/uwsgi/planetstack.ini b/planetstack/uwsgi/planetstack.ini
index 1d84d99..625dafe 100644
--- a/planetstack/uwsgi/planetstack.ini
+++ b/planetstack/uwsgi/planetstack.ini
@@ -1,5 +1,5 @@
 [uwsgi]
-chdir = /opt/planetstack
+chdir = /opt/xos
 module = planetstack.wsgi:application
 env = DJANGO_SETTINGS_MODULE=planetstack.settings
 socket = /var/run/uwsgi/planetstack.sock
diff --git a/planetstack/planetstack-config.py b/planetstack/xos-config.py
old mode 100644
new mode 100755
similarity index 100%
rename from planetstack/planetstack-config.py
rename to planetstack/xos-config.py
diff --git a/planetstack/planetstack-backend.py b/planetstack/xos-observer.py
similarity index 100%
rename from planetstack/planetstack-backend.py
rename to planetstack/xos-observer.py
diff --git a/planetstack/xos_config b/planetstack/xos_config
index fb846b3..86864cc 100644
--- a/planetstack/xos_config
+++ b/planetstack/xos_config
@@ -19,7 +19,7 @@
 omf_enabled=0
 mail_support_address=support@localhost
 nova_enabled=True
-logfile=/var/log/planetstack.log
+logfile=/var/log/xos.log
 
 [nova]
 admin_user=admin@domain.com
@@ -32,6 +32,6 @@
 ca_ssl_cert=/etc/ssl/certs/ca-certificates.crt
 
 [observer]
-images_directory=/opt/planetstack/images
-dependency_graph=/opt/planetstack/model-deps
-logfile=/var/log/planetstack_backend.log
+images_directory=/opt/xos/images
+dependency_graph=/opt/xos/model-deps
+logfile=/var/log/xos_backend.log
diff --git a/setup.py b/setup.py
index a250b29..bc486e5 100644
--- a/setup.py
+++ b/setup.py
@@ -23,4 +23,4 @@
         ('/lib/systemd/system/', ['planetstack/redhat/planetstack-backend.service']),
         ])
 
-copytree('planetstack/', '/opt/planetstack')
+copytree('planetstack/', '/opt/xos')
diff --git a/opencloud.spec b/xos.spec
similarity index 95%
rename from opencloud.spec
rename to xos.spec
index 611750d..5896250 100644
--- a/opencloud.spec
+++ b/xos.spec
@@ -1,7 +1,7 @@
 Summary: OpenCloud core services
-Name: opencloud
-Version: 1.0.29
-Release: 3
+Name: xos
+Version: 1.1.0
+Release: 1
 License: GPL+
 Group: Development/Tools
 Source0: %{_tmppath}/%{name}-%{version}.tar.gz
@@ -96,7 +96,7 @@
 
 # remove config files from the file list (see %config below)
 cat > %{_tmppath}/config-files << "EOF"
-/opt/planetstack/plstackapi_config
+/opt/planetstack/xos_config
 /opt/planetstack/deployment_auth.py
 EOF
 
@@ -112,7 +112,7 @@
 
 %files -f %{_tmppath}/tmp-filelist
 %defattr(-,root,root,-)
-%config /opt/planetstack/plstackapi_config
+%config /opt/planetstack/xos_config
 %config /opt/planetstack/deployment_auth.py
 %config /opt/planetstack/model-deps
 
@@ -148,7 +148,7 @@
 
 %preun
 if [ "$1" = 0 ] ; then
-    echo "UNINSTALL - destroying planetstack"
+    echo "UNINSTALL - destroying xos"
     rm -rf /opt/planetstack
 fi