Minor fixes/comments
[snf-occi] / snfOCCI / compute.py
index 28621f7..7d2dc97 100644 (file)
@@ -1,9 +1,12 @@
+from snfOCCI.config import SERVER_CONFIG
+
 from kamaki.clients.compute import ComputeClient
 from kamaki.clients.cyclades import CycladesClient
 from kamaki.config  import Config
 
 from occi.backend import ActionBackend, KindBackend
 from occi.extensions.infrastructure import COMPUTE, START, STOP, SUSPEND, RESTART
+from occi.exceptions import HTTPError
 
 
 #Compute Backend for snf-occi-server
@@ -14,21 +17,13 @@ class MyBackend(KindBackend, ActionBackend):
     attributes. Support for links and mixins would need to added.
     '''
 
-    def update(self, old, new, extras):
-        # here you can check what information from new_entity you wanna bring
-        # into old_entity
+    # Updating and Replacing compute instances not supported by Cyclades
 
-        # trigger your hypervisor and push most recent information
-        print('Updating a resource with id: ' + old.identifier)
-        for item in new.attributes.keys():
-            old.attributes[item] = new.attributes[item]
+    def update(self, old, new, extras):
+        raise AttributeError("This action is currently no applicable.")
 
     def replace(self, old, new, extras):
-        print('Replacing a resource with id: ' + old.identifier)
-        old.attributes = {}
-        for item in new.attributes.keys():
-            old.attributes[item] = new.attributes[item]
-        old.attributes['occi.compute.state'] = 'inactive'
+        raise AttributeError("This action is currently no applicable.")
 
 
 class ComputeBackend(MyBackend):
@@ -37,6 +32,8 @@ class ComputeBackend(MyBackend):
     '''
 
     def create(self, entity, extras):
+
+        #Creating new compute instance
     
         for mixin in entity.mixins:
             if mixin.related[0].term == 'os_tpl':
@@ -46,11 +43,8 @@ class ComputeBackend(MyBackend):
                 flavor = mixin
                 flavor_id = mixin.attributes['occi.core.id']
                 
-        entity.attributes['occi.compute.state'] = 'active'
-        entity.actions = [STOP, SUSPEND, RESTART]
-
-        #Registry identifier is the uuid key occi.handler assigns
-        #attribute 'occi.core.id' will be the snf-server id
+        entity.attributes['occi.compute.state'] = 'inactive'
+        entity.actions = [START]
 
         conf = Config()
         conf.set('token',extras['token'])
@@ -59,12 +53,15 @@ class ComputeBackend(MyBackend):
         vm_name = entity.attributes['occi.compute.hostname']
         info = snf.create_server(vm_name, flavor_id, image_id)
         entity.attributes['occi.core.id'] = str(info['id'])
+        entity.attributes['occi.compute.architecture'] = SERVER_CONFIG['compute_arch']
         entity.attributes['occi.compute.cores'] = flavor.attributes['occi.compute.cores']
         entity.attributes['occi.compute.memory'] = flavor.attributes['occi.compute.memory']
+        entity.attributes['occi.compute.hostname'] = SERVER_CONFIG['hostname'] % {'id':info['id']}
 
     def retrieve(self, entity, extras):
         
-        # triggering cyclades to retrieve up to date information
+        #Triggering cyclades to retrieve up to date information
+
         conf = Config()
         conf.set('token',extras['token'])
         snf = ComputeClient(conf)
@@ -81,18 +78,23 @@ class ComputeBackend(MyBackend):
                        }
         
         entity.attributes['occi.compute.state'] = status_dict[vm_state]
+                
+        if vm_state == 'ERROR':
+            raise HTTPError(500, 'ERROR building the compute instance')
 
-        if entity.attributes['occi.compute.state'] == 'inactive':
-            entity.actions = [START]
-        if entity.attributes['occi.compute.state'] == 'active': 
-            entity.actions = [STOP, SUSPEND, RESTART]
-        if entity.attributes['occi.compute.state'] == 'suspended':
-            entity.actions = [START]
+        else:
+            if entity.attributes['occi.compute.state'] == 'inactive':
+                entity.actions = [START]
+            if entity.attributes['occi.compute.state'] == 'active': 
+                entity.actions = [STOP, SUSPEND, RESTART]
+            if entity.attributes['occi.compute.state'] == 'suspended':
+                entity.actions = [START]
 
 
     def delete(self, entity, extras):
 
-        # delete vm with vm_id = entity.attributes['occi.core.id']
+        #Deleting compute instance
+
         conf = Config()
         conf.set('token',extras['token'])
         snf = ComputeClient(conf)
@@ -103,29 +105,36 @@ class ComputeBackend(MyBackend):
 
     def action(self, entity, action, extras):
 
+        #Triggering action to compute instances
+
         conf = Config()
         conf.set('token',extras['token'])
         client = CycladesClient(conf)
+        snf = ComputeClient(conf)
 
         vm_id = int(entity.attributes['occi.core.id'])
+        vm_info = snf.get_server_details(vm_id)
+        vm_state = vm_info['status']
 
-        if action not in entity.actions:
-            raise AttributeError("This action is currently no applicable.")
-
-        elif action == START:
-            print "Starting VM"
-            client.start_server(vm_id)
 
+        if vm_state == 'ERROR':
+            raise HTTPError(500, 'ERROR building the compute instance')
 
-        elif action == STOP:
-            print "Stopping VM"
-            client.shutdown_server(vm_id)
+        else:
+            if action not in entity.actions:
+                raise AttributeError("This action is currently no applicable.")
             
-        elif action == RESTART:
-            print "Restarting VM"
-            snf.reboot_server(vm_id)
-
+            elif action == START:
+                print "Starting VM"
+                client.start_server(vm_id)
+                
+            elif action == STOP:
+                print "Stopping VM"
+                client.shutdown_server(vm_id)
+    
+            elif action == RESTART:
+                print "Restarting VM"
+                snf.reboot_server(vm_id)
 
-        elif action == SUSPEND:
-            #TODO VM suspending
-            print "Suspending VM"
+            elif action == SUSPEND:
+                raise AttributeError("This actions is currently no applicable")