initial checkin
diff --git a/plstackapi/openstack/client.py b/plstackapi/openstack/client.py
new file mode 100644
index 0000000..04aef25
--- /dev/null
+++ b/plstackapi/openstack/client.py
@@ -0,0 +1,123 @@
+from keystoneclient.v2_0 import client as keystone_client
+from glance import client as glance_client
+from novaclient.v1_1 import client as nova_client
+from quantumclient.v2_0 import client as quantum_client
+
+from plstackapi.planetstack.config import Config
+
+def parse_novarc(filename):
+    opts = {}
+    f = open(filename, 'r')
+    for line in f:
+        try:
+            line = line.replace('export', '').strip()
+            parts = line.split('=')
+            if len(parts) > 1:
+                value = parts[1].replace("\'", "")
+                value = value.replace('\"', '')
+                opts[parts[0]] = value
+        except:
+            pass
+    f.close()
+    return opts
+
+class Client:
+    def __init__(self, username=None, password=None, tenant=None, url=None, config=None, *args, **kwds):
+        if config:
+            config = Config(config)
+        else:
+            config = Config()
+        self.username = config.nova_admin_user
+        self.password = config.nova_admin_password
+        self.tenant = config.nova_admin_tenant
+        self.url = config.nova_url
+
+        if username:
+            self.username = username
+        if password:
+            self.password = password
+        if tenant:
+            self.tenant = tenant
+        if url:
+            self.url = url
+
+        if '@' in self.username:
+            self.username = self.username[:self.username.index('@')]
+
+class KeystoneClient(Client):
+    def __init__(self, *args, **kwds):
+        Client.__init__(self, *args, **kwds)
+        self.client = keystone_client.Client(username=self.username,
+                                             password=self.password,
+                                             tenant_name=self.tenant,
+                                             auth_url=self.url)
+
+    def connect(self, *args, **kwds):
+        self.__init__(*args, **kwds)
+
+    def __getattr__(self, name):
+        return getattr(self.client, name)
+
+
+class GlanceClient(Client):
+    def __init__(self, *args, **kwds):
+        Client.__init__(self, *args, **kwds)
+        self.client = glance_client.get_client(host='0.0.0.0',
+                                               username=self.username,
+                                               password=self.password,
+                                               tenant=self.tenant,
+                                               auth_url=self.url)
+    def __getattr__(self, name):
+        return getattr(self.client, name)
+
+class NovaClient(Client):
+    def __init__(self, *args, **kwds):
+        Client.__init__(self, *args, **kwds)
+        self.client = nova_client.Client(username=self.username,
+                                         api_key=self.password,
+                                         project_id=self.tenant,
+                                         auth_url=self.url,
+                                         region_name='',
+                                         extensions=[],
+                                         service_type='compute',
+                                         service_name='',
+                                         )
+
+    def connect(self, *args, **kwds):
+        self.__init__(*args, **kwds)
+
+    def __getattr__(self, name):
+        return getattr(self.client, name)
+
+class QuantumClient(Client):
+    def __init__(self, *args, **kwds):
+        Client.__init__(self, *args, **kwds)
+        self.client = quantum_client.Client(username=self.username,
+                                            password=self.password,
+                                            tenant_name=self.tenant,
+                                            auth_url=self.url)
+    def connect(self, *args, **kwds):
+        self.__init__(*args, **kwds)
+
+    def __getattr__(self, name):
+        return getattr(self.client, name)
+
+class OpenStackClient:
+    """
+    A simple native shell to the openstack backend services.
+    This class can receive all nova calls to the underlying testbed
+    """
+
+    def __init__ ( self, *args, **kwds) :
+        # instantiate managers
+        self.keystone = KeystoneClient(*args, **kwds)
+        self.glance = GlanceClient(*args, **kwds)
+        self.nova = NovaClient(*args, **kwds)
+        self.quantum = QuantumClient(*args, **kwds)
+
+    def connect(self, *args, **kwds):
+        self.__init__(*args, **kwds)
+        
+
+    def authenticate(self):
+        return self.keystone.authenticate()
diff --git a/plstackapi/planetstack/api/__init__.py b/plstackapi/planetstack/api/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plstackapi/planetstack/api/__init__.py
diff --git a/plstackapi/planetstack/api/roles.py b/plstackapi/planetstack/api/roles.py
new file mode 100644
index 0000000..cd737b0
--- /dev/null
+++ b/plstackapi/planetstack/api/roles.py
@@ -0,0 +1,34 @@
+from plstackapi.openstack.client import OpenStackClient
+from plstackapi.openstack.driver import OpenStackDriver
+from plstackapi.planetstack.models import * 
+
+
+def auth_check(auth):
+    client = OpenStackShell(username=auth['Username'],
+                            password=auth['AuthMethod',
+                            tenant=auth['LoginBase'])
+    client.authenticate()
+    return client
+
+
+def add_role(auth, name):
+    client = auth_check(auth)
+    keystone_role = client.keystone.roles.create(name)
+    role = Role(role_type=name, role_id=keystone_role.id)
+    role.save()
+    return role
+
+def delete_role(auth, name):
+    client = auth_check(auth)
+    role = Role.objects.filter(role_type=name)
+    client.keystone.roles.delete(role.role_id)
+    role.delete()
+    return 1
+
+def get_roles(auth, filter):
+    client = auth_check(auth)
+    roles = Role.objects.filter(**filter)
+    return roles             
+        
+
+    
diff --git a/plstackapi/planetstack/views/__init__.py b/plstackapi/planetstack/views/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plstackapi/planetstack/views/__init__.py
diff --git a/plstackapi/planetstack/views/api_root.py b/plstackapi/planetstack/views/api_root.py
new file mode 100644
index 0000000..707e06b
--- /dev/null
+++ b/plstackapi/planetstack/views/api_root.py
@@ -0,0 +1,12 @@
+from rest_framework.decorators import api_view
+from rest_framework.response import Response
+from rest_framework.reverse import reverse
+
+@api_view(['GET'])
+def api_root(request, format=None):
+    return Response({
+        'nodes': reverse('node-list', request=request, format=format),
+        'sites': reverse('site-list', request=request, format=format),
+        'deploymentNetworks': reverse('deploymentnetwork-list', request=request, format=format),
+        'slices': reverse('slice-list', request=request, format=format)
+    })