HyperlinkedModelSerializer doesn't include the id by default
[plstackapi.git] / plstackapi / openstack / driver.py
index 20de0f8..f6817cf 100644 (file)
 from plstackapi.planetstack.config import Config
-from plstackapi.openstack.shell import OpenStackShell
+from plstackapi.openstack.client import OpenStackClient
 
 class OpenStackDriver:
 
-    def __init__(self, config = None): 
+    def __init__(self, config = None, client=None): 
         if config:
             self.config = Config(config)
         else:
             self.config = Config() 
-        self.shell = OpenStackShell()
 
-    def create_tenant(self, **kwds):
-        """Create keystone tenant. Suggested fields: name, description, enabled"""  
-        required_fields = ['name', 'enabled', 'description']
-        for field in required_fields:
-            if field not in kwds:
-                raise Exception, "Must specify %s" % field
+        if client:
+            self.shell = client
+        else:
+            self.shell = OpenStackClient()
+
+    def create_role(self, name): 
+        roles = self.shell.keystone.roles.findall(name=name)
+        if not roles:
+            role = self.shell.keystone.roles.create(name)
+        else:
+            role = roles[0] 
+        return role
+
+    def delete_role(self, filter):
+        roles = self.shell.keystone.roles.findall(**filter)
+        for role in roles:
+            self.shell.keystone.roles.delete(role)
+        return 1
 
-        tenants = self.shell.keystone.tenants.findall(name=kwds['name'])
+    def create_tenant(self, tenant_name, enabled, description):
+        """Create keystone tenant. Suggested fields: name, description, enabled"""  
+        tenants = self.shell.keystone.tenants.findall(name=tenant_name)
         if not tenants:
-            tenant = self.shell.keystone.tenants.create(**kwds)
+            fields = {'tenant_name': tenant_name, 'enabled': enabled, 
+                      'description': description}  
+            tenant = self.shell.keystone.tenants.create(**fields)
         else:
             tenant = tenants[0]
         return tenant
 
     def update_tenant(self, id, **kwds):
-        return self.shell.keystone.tenants.update(self.id, **kwds)
+        return self.shell.keystone.tenants.update(id, **kwds)
 
     def delete_tenant(self, id):
         tenant = self.shell.keystone.tenants.find(id=id)
         return self.shell.keystone.tenants.delete(tenant)
-         
+
+    def create_user(self, name, email, password, enabled):
+        users = self.shell.keystone.users.findall(email=email)
+        if not users:
+            fields = {'name': name, 'email': email, 'password': password,
+                      'enabled': enabled}
+            user = self.shell.keystone.create(**fields)
+        else: 
+            user = users[0]
+        return user
+
+    def add_user_role(self, user_id, tenant_id, role_name):
+        user = self.shell.keystone.users.find(id=user_id)
+        tenant = self.shell.keystone.tenants.find(id=tenant_id)
+        role = self.shell.keystone.roles.find(role_name)
+        return tenant.add_user(user, role)
+
+    def delete_user_role(self, user_id, tenant_id, role_name):
+        user = self.shell.keystone.users.find(id=user_id)
+        tenant = self.shell.keystone.tenants.find(id=tenant_id)
+        role = self.shell.keystone.roles.find(role_name)
+        return tenant.delete_user(user, role)
+
+    def update_user(self, id, **kwds):
+        return self.shell.keystone.users.update(id, **kwds)
+
+    def delete_user(self, id):
+        user = self.shell.keystone.users.find(id=id)
+        return self.shell.keystone.users.delete(user)  
+
+    def create_router(self, name, set_gateway=True):
+        router = self.shell.quantum.create_router(name=name)
+        if set_gateway:
+            nets = self.shell.quantum.list_networks()
+            for net in nets:
+                if net['router:external'] == True: 
+                    self.shell.quantum.add_gateway_router(router, net)
+        
+        return router
+
+    def delete_router(self, name):
+        return self.shell.quantum.delete_router(name=name)
+
+    def add_router_interface(self, router_id, subnet_id):
+        router = None
+        subnet = None
+        for r in self.shell.quantum.list_routers():
+            if r['id'] == router_id:
+                router = r
+                break
+        for s in self.shell.quantum.list_subnets():
+            if s['id'] == subnet_id:
+                subnet = s
+                break
+
+        if router and subnet:
+            self.shell.quantum.router_add_interface(router, subnet)
+
+    def delete_router_interface(self, router_id, subnet_id):
+        router = None
+        subnet = None
+        for r in self.shell.quantum.list_routers():
+            if r['id'] == router_id:
+                router = r
+                break
+        for s in self.shell.quantum.list_subnets():
+            if s['id'] == subnet_id:
+                subnet = s
+                break
+
+        if router and subnet:
+            self.shell.quantum.router_remove_interface(router, subnet)            
+    def create_network(self, name):
+        return self.shell.quantum.create_network(name=name, admin_state_up=True)
+    
+    def delete_network(self, name):
+        nets = self.shell.quantum.list_networks(name=name)
+        for net in nets:
+            # delete all subnets:
+            #subnets = self.api.client_shell.quantum.list_subnets(network_id=net['network_id'])['subnets']
+            for subnet_id in net['subnets']:
+                self.delete_subnet(subnet_id)
+            self.shell.quantum.delete_network(net['id'])
+    
+    def create_subnet(self, network_name, cidr_ip, ip_version, start, end):
+        nets = self.shell.quantum.list_networks(name=network_name)
+        if not nets:
+            raise Exception, "No such network: %s" % network_name   
+        nets = nets[0]
+
+        subnets = self.shell.quantum.list_subnets(name=self.name)
+        allocation_pools = [{'start': start, 'end': end}]
+        subnet = self.shell.quantum.create_subnet(network_id=net['id'],
+                                                ip_version=ip_version,
+                                                cidr=cidr_ip,
+                                                dns_nameservers=['8.8.8.8', '8.8.8.4'],         
+                                                allocation_pools=allocation_pools)
+
+        # TODO: Add route to external network
+        # e.g. #  route add -net 10.0.3.0/24 dev br-ex gw 10.100.0.5 
+        return subnet
+
+    def delete_subnet(self, id):
+        return self.client.quantum.delete_subnet(id=id)
+     
+    
+    def create_keypair(self, name, key):
+        keys = self.client.nova.keypairs.findall(name=name)
+        if keys:
+            raise Exception, "Key name already exists: %s" % name
+        return self.client.nova.keypairs.create(name=name, public_key=key)
+
+    def delete_keypair(self, name):
+        keys = self.client.nova.keypairs.findall(name=name)
+        for key in keys:
+            self.client.nova.keypairs.delete(key) 
 
     def spawn_instance(self, name, key_name=None, hostname=None, flavor=None, image=None, security_group=None, pubkeys=[]):
         if not flavor: