diff --git a/server/src/uds/services/OpenNebula/LiveDeployment.py b/server/src/uds/services/OpenNebula/LiveDeployment.py index ec039a0fd..bca66cae8 100644 --- a/server/src/uds/services/OpenNebula/LiveDeployment.py +++ b/server/src/uds/services/OpenNebula/LiveDeployment.py @@ -39,7 +39,7 @@ from . import on import pickle import logging -__updated__ = '2017-02-28' +__updated__ = '2017-03-27' logger = logging.getLogger(__name__) @@ -229,7 +229,7 @@ class LiveDeployment(UserDeployment): ret = State.RUNNING - if type(chkState) is list: + if isinstance(chkState, (list, tuple)): if state in chkState: ret = State.FINISHED else: diff --git a/server/src/uds/services/OpenNebula/LivePublication.py b/server/src/uds/services/OpenNebula/LivePublication.py index b3f0a20ef..4aa75436b 100644 --- a/server/src/uds/services/OpenNebula/LivePublication.py +++ b/server/src/uds/services/OpenNebula/LivePublication.py @@ -34,11 +34,13 @@ from django.utils.translation import ugettext as _ from uds.core.services import Publication from uds.core.util.State import State -from datetime import datetime + +import six + import logging -__updated__ = '2016-07-22' +__updated__ = '2017-03-27' logger = logging.getLogger(__name__) @@ -93,7 +95,7 @@ class LivePublication(Publication): self._templateId = self.service().makeTemplate(self._name) except Exception as e: self._state = 'error' - self._reason = str(e) + self._reason = six.text_type(e) return State.ERROR return State.RUNNING @@ -103,9 +105,13 @@ class LivePublication(Publication): Checks state of publication creation ''' if self._state == 'running': - if self.service().checkTemplatePublished(self._templateId) is False: - return - self._state = 'ok' + try: + if self.service().checkTemplatePublished(self._templateId) is False: + return + self._state = 'ok' + except Exception as e: + self._state = 'error' + self._reason = six.text_type(e) if self._state == 'error': return State.ERROR diff --git a/server/src/uds/services/OpenNebula/on/__init__.py b/server/src/uds/services/OpenNebula/on/__init__.py index 3f852392f..6915eb22a 100644 --- a/server/src/uds/services/OpenNebula/on/__init__.py +++ b/server/src/uds/services/OpenNebula/on/__init__.py @@ -43,7 +43,7 @@ import six import xmlrpclib from uds.core.util import xml2dict -__updated__ = '2016-11-10' +__updated__ = '2017-03-27' logger = logging.getLogger(__name__) @@ -296,6 +296,14 @@ class OpenNebulaClient(object): result = self.connection.one.vm.info(self.sessionString, int(vmId)) return int(checkResult(result)['VM']['STATE']) + @ensureConnected + def getVMLCMState(self, vmId): + ''' + Returns the VM State + ''' + result = self.connection.one.vm.info(self.sessionString, int(vmId)) + return int(checkResult(result)['VM']['LCM_STATE']) + @ensureConnected def VMAction(self, vmId, action): result = self.connection.one.vm.action(self.sessionString, action, int(vmId)) diff --git a/server/src/uds/services/OpenNebula/on/template.py b/server/src/uds/services/OpenNebula/on/template.py index 2d6c91a95..c1d98c42f 100644 --- a/server/src/uds/services/OpenNebula/on/template.py +++ b/server/src/uds/services/OpenNebula/on/template.py @@ -38,7 +38,7 @@ from defusedxml import minidom # Python bindings for OpenNebula from .common import sanitizeName -__updated__ = '2017-03-07' +__updated__ = '2017-03-27' logger = logging.getLogger(__name__) @@ -203,8 +203,11 @@ def checkPublished(api, templateId): logger.debug('Found {} for checking'.format(imgId)) - if api.imageInfo(imgId)[0]['IMAGE']['STATE'] == '4': + state = api.imageInfo(imgId)[0]['IMAGE']['STATE'] + if state in ('0', '4'): return False + elif state != '1': # If error is not READY + raise Exception('Error publishing. Image is in an invalid state. (Check it and delete it if not needed anymore)') except Exception: logger.exception('Exception checking published') raise