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
87 lines
2.6 KiB
Python
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
|