Files
deb-python-taskflow/taskflow/jobs/job.py
Joshua Harlow e70032d0d9 Remove decorators and move to utils
In order to avoid the circular import
in threading utils move the decorators
functionality to utils/misc and move the
locking functionality to utils/lock_utils
and then use these functions from the
threading util (and elsewhere).

Fixes bug: 1236080

Change-Id: I9e71c2ba15782cbb6dd5ab7e1264b77ed47bc29e
2013-10-07 15:43:21 -07:00

87 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright (C) 2013 Rackspace Hosting Inc. All Rights Reserved.
# Copyright (C) 2013 Yahoo! Inc. All Rights Reserved.
#
# 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.
import threading
from taskflow.openstack.common import uuidutils
from taskflow.utils import lock_utils
class Job(object):
"""A job is a higher level abstraction over a set of flows as well as the
*ownership* of those flows, it is the highest piece of work that can be
owned by an entity performing those flows.
Only one entity will be operating on the flows contained in a job at a
given time (for the foreseeable future).
It is the object that should be transferred to another entity on failure of
so that the contained flows ownership can be transferred to the secondary
entity for resumption/continuation/reverting.
"""
def __init__(self, name, uuid=None):
if uuid:
self._uuid = uuid
else:
self._uuid = uuidutils.generate_uuid()
self._name = name
self._lock = threading.RLock()
self._flows = []
self.owner = None
self.state = None
self.book = None
@lock_utils.locked
def add(self, *flows):
self._flows.extend(flows)
@lock_utils.locked
def remove(self, flow):
j = -1
for i, f in enumerate(self._flows):
if f.uuid == flow.uuid:
j = i
break
if j == -1:
raise ValueError("Could not find %r to remove" % (flow))
self._flows.pop(j)
def __contains__(self, flow):
for f in self:
if f.uuid == flow.uuid:
return True
return False
@property
def uuid(self):
"""The uuid of this job"""
return self._uuid
@property
def name(self):
"""The non-uniquely identifying name of this job"""
return self._name
def __iter__(self):
# Don't iterate while holding the lock
with self._lock:
flows = list(self._flows)
for f in flows:
yield f