X-Git-Url: https://code.grnet.gr/git/snf-occi/blobdiff_plain/d7dfc401c4b23e193f996e3e03b0a941d64ce6c2..711721d6806197744e7af712523042cbb9d898a9:/snfOCCI/compute.py diff --git a/snfOCCI/compute.py b/snfOCCI/compute.py index 79a7e1e..7d2dc97 100644 --- a/snfOCCI/compute.py +++ b/snfOCCI/compute.py @@ -6,6 +6,7 @@ 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 @@ -16,6 +17,8 @@ class MyBackend(KindBackend, ActionBackend): attributes. Support for links and mixins would need to added. ''' + # Updating and Replacing compute instances not supported by Cyclades + def update(self, old, new, extras): raise AttributeError("This action is currently no applicable.") @@ -29,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': @@ -41,9 +46,6 @@ class ComputeBackend(MyBackend): entity.attributes['occi.compute.state'] = 'inactive' entity.actions = [START] - #Registry identifier is the uuid key occi.handler assigns - #attribute 'occi.core.id' will be the snf-server id - conf = Config() conf.set('token',extras['token']) snf = ComputeClient(conf) @@ -58,7 +60,8 @@ class ComputeBackend(MyBackend): 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) @@ -75,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) @@ -97,28 +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: - raise AttributeError("This actions is currently no applicable") + elif action == SUSPEND: + raise AttributeError("This actions is currently no applicable")