deb-mistral/mistral/workflow/utils.py
Renat Akhmerov 9d06a61fe4 Optimize the logic that check if 'join' task is allowed to start
* Moved DB related lookup functions from workflow/utils to
  a separate module lookup_utils
* Optimized data access pattern where we calculate 'join'
  states induced by upstream tasks, applied caching for some
  lookup operations
* Added caching in direct workflow specification for inbound
  and outbound task specs, if workflow size is large calculating
  them may be expensive
* Added an adaptive delay between calls that refresh 'join'
  task state based on a number of unfulfilled preconditions
  returned by workflow controller

Change-Id: I383fa52f2f05877df7522048020cc7ff280324a2
2016-09-15 14:27:25 +03:00

73 lines
2.1 KiB
Python

# Copyright 2014 - Mirantis, Inc.
# Copyright 2015 - StackStorm, Inc.
# Copyright 2016 - Brocade Communications Systems, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from mistral.utils import serializers
class Result(object):
"""Explicit data structure containing a result of task execution."""
def __init__(self, data=None, error=None, cancel=False):
self.data = data
self.error = error
self.cancel = cancel
def __repr__(self):
return 'Result [data=%s, error=%s, cancel=%s]' % (
repr(self.data), repr(self.error), str(self.cancel)
)
def is_cancel(self):
return self.cancel
def is_error(self):
return self.error is not None and not self.is_cancel()
def is_success(self):
return not self.is_error() and not self.is_cancel()
def __eq__(self, other):
return (
self.data == other.data and
self.error == other.error and
self.cancel == other.cancel
)
def __ne__(self, other):
return not self.__eq__(other)
def to_dict(self):
return ({'result': self.data}
if self.is_success() else {'result': self.error})
class ResultSerializer(serializers.Serializer):
@staticmethod
def serialize(entity):
return {
'data': entity.data,
'error': entity.error,
'cancel': entity.cancel
}
@staticmethod
def deserialize(entity):
return Result(
entity['data'],
entity['error'],
entity.get('cancel', False)
)