def _execute(self, pkg_loader): class_loader = package_class_loader.PackageClassLoader(pkg_loader) system_objects.register(class_loader, pkg_loader) get_plugin_loader().register_in_loader(class_loader) exc = executor.MuranoDslExecutor(class_loader, self.environment) obj = exc.load(self.model) self._validate_model(obj, self.action, class_loader) action_result = None exception = None exception_traceback = None try: LOG.info(_LI('Invoking pre-cleanup hooks')) self.environment.start() exc.cleanup(self._model) except Exception as e: exception = e exception_traceback = TaskExecutor._log_exception(e, obj, '<GC>') finally: LOG.info(_LI('Invoking post-cleanup hooks')) self.environment.finish() if exception is None and self.action: try: LOG.info(_LI('Invoking pre-execution hooks')) self.environment.start() action_result = self._invoke(exc) except Exception as e: exception = e exception_traceback = TaskExecutor._log_exception( e, obj, self.action['method']) finally: LOG.info(_LI('Invoking post-execution hooks')) self.environment.finish() model = serializer.serialize_model(obj, exc) model['SystemData'] = self._environment.system_attributes result = { 'model': model, 'action': { 'result': None, 'isException': False } } if exception is not None: result['action'] = TaskExecutor.exception_result( exception, exception_traceback) else: result['action']['result'] = serializer.serialize_object( action_result) return result
def _execute(self, pkg_loader): class_loader = package_class_loader.PackageClassLoader(pkg_loader) system_objects.register(class_loader, pkg_loader) get_plugin_loader().register_in_loader(class_loader) exc = executor.MuranoDslExecutor(class_loader, self.environment) obj = exc.load(self.model) self._validate_model(obj, self.action, class_loader) action_result = None exception = None exception_traceback = None try: LOG.info(_LI('Invoking pre-execution hooks')) self.environment.start() # Skip execution of action in case no action is provided. # Model will be just loaded, cleaned-up and unloaded. # Most of the time this is used for deletion of environments. if self.action: action_result = self._invoke(exc) except Exception as e: exception = e if isinstance(e, dsl_exception.MuranoPlException): LOG.error('\n' + e.format(prefix=' ')) else: exception_traceback = traceback.format_exc() LOG.exception( _LE("Exception %(exc)s occured" " during invocation of %(method)s"), {'exc': e, 'method': self.action['method']}) reporter = status_reporter.StatusReporter() reporter.initialize(obj) reporter.report_error(obj, str(e)) finally: LOG.info(_LI('Invoking post-execution hooks')) self.environment.finish() model = serializer.serialize_model(obj, exc) model['SystemData'] = self._environment.system_attributes result = { 'model': model, 'action': { 'result': None, 'isException': False } } if exception is not None: result['action'] = TaskExecutor.exception_result( exception, exception_traceback) else: result['action']['result'] = serializer.serialize_object( action_result) return result
def test_value_deserialization(self): """Test serialization of arbitrary values that can be returned from action methods """ runner = self.new_runner(self._class2) result = runner.testMethod() self.assertEqual( { 'key1': 'abc', 'key2': ['a', 'b', 'c'], 'key3': None, 'key4': False, 'key5': {'x': 'y'}, 'key6': [{'w': 'q'}] }, serializer.serialize_object(result))
def _execute(self, pkg_loader): class_loader = package_class_loader.PackageClassLoader(pkg_loader) system_objects.register(class_loader, pkg_loader) get_plugin_loader().register_in_loader(class_loader) exc = executor.MuranoDslExecutor(class_loader, self.environment) obj = exc.load(self.model) self._validate_model(obj, self.action, class_loader) action_result = None exception = None exception_traceback = None try: LOG.info(_LI('Invoking pre-cleanup hooks')) self.environment.start() exc.cleanup(self._model) except Exception as e: exception = e exception_traceback = TaskExecutor._log_exception(e, obj, '<GC>') finally: LOG.info(_LI('Invoking post-cleanup hooks')) self.environment.finish() if exception is None and self.action: try: LOG.info(_LI('Invoking pre-execution hooks')) self.environment.start() action_result = self._invoke(exc) except Exception as e: exception = e exception_traceback = TaskExecutor._log_exception( e, obj, self.action['method']) finally: LOG.info(_LI('Invoking post-execution hooks')) self.environment.finish() model = serializer.serialize_model(obj, exc) model['SystemData'] = self._environment.system_attributes result = { 'model': model, 'action': { 'result': None, 'isException': False } } if exception is not None: result['action'] = TaskExecutor.exception_result( exception, exception_traceback) # NOTE(kzaitsev): Exception here means that it happened during # cleanup. ObjectsCopy and Attributes would be empty if obj # is empty. This would cause failed env to be deleted. # Therefore restore these attrs from self._model for attr in ['ObjectsCopy', 'Attributes']: if not model.get(attr): model[attr] = self._model[attr] else: result['action']['result'] = serializer.serialize_object( action_result) return result