Source code for networkapi.distributedlock

# -*- coding: utf-8 -*-
from __future__ import with_statement

LOCK_LOGICAL_ENVIRONMENT = 'logical_environment:%s'
LOCK_ENVIRONMENT = 'environment:%s'
LOCK_ENVIRONMENT_ALLOCATES = 'environment_allocates:%s'
LOCK_VLAN_ALLOCATES = 'vlan_allocates:%s'
LOCK_DC_DIVISION = 'division:%s'
LOCK_DCHCPv4_NET = 'DHCPrelayIPv4Network:%s'
LOCK_DCHCPv6_NET = 'DHCPrelayIPv6Network:%s'
LOCK_ENVIRONMENT_VIP = 'environment_vip:%s'
LOCK_EQUIPMENT_ACCESS = 'equipment_access:%s'
LOCK_EQUIPMENT = 'equipment:%s'
LOCK_EQUIPMENT_GROUP = 'equipment_group:%s'
LOCK_EQUIPMENT_DEPLOY_CONFIG_USERSCRIPT = 'equipment_deploy_config_userscript:%s'
LOCK_EQUIPMENT_DEPLOY_CONFIG_NETWORK_SCRIPT = 'equipment_deploy_config_network_script:%s'
LOCK_EQUIPMENT_SCRIPT = 'equipment_script:%s'
LOCK_EQUIPMENT_ENVIRONMENT = 'equipment_environment:%s'
LOCK_GROUP_USER = 'group_user:%s'
LOCK_GROUP_EQUIPMENT = 'group_equipment:%s'
LOCK_GROUP_RIGHTS = 'group_rights:%s'
LOCK_GROUP_VIRTUAL = 'group_virtual'
LOCK_GROUP_L3 = 'group_l3:%s'
LOCK_PERM = 'perm:%s'
LOCK_INTERFACE = 'interface:%s'
LOCK_INTERFACE_DEPLOY_CONFIG = 'interface_equipment:%s'
LOCK_IP_EQUIPMENT_ONE = 'ip_equipment:%s'
LOCK_IP_EQUIPMENT = 'ip_equipment:%s:%s'
LOCK_VINTERFACE = 'vinterface:%s'
LOCK_IPV6_EQUIPMENT_ONE = 'ipv6_equipment:%s'
LOCK_IPV6_EQUIPMENT = 'ipv6_equipment:%s:%s'
LOCK_IPV4 = 'ipv4:%s'
LOCK_NETWORK_IPV4 = 'network_ipv4:%s'
LOCK_IPV6 = 'ipv6:%s'
LOCK_NETWORK_IPV6 = 'network_ipv6:%s'
LOCK_BRAND = 'brand:%s'
LOCK_MODEL = 'model:%s'
LOCK_VIP = 'vip:%s'
LOCK_NEIGHBOR_V4 = 'neighbor_v4:%s'
LOCK_NEIGHBOR_V6 = 'neighbor_v6:%s'
LOCK_PEER_GROUP = 'peer_group:%s'
LOCK_ROUTE_MAP = 'route_map:%s'
LOCK_ROUTE_MAP_ENTRY = 'route_map_entry:%s'
LOCK_LIST_CONFIG_BGP = 'list_config_bgp:%s'
LOCK_OPTIONS_VIP = 'options_vip:%s'
LOCK_VIP_IP_EQUIP = 'vip_ip_equip:%s:%s:%s'
LOCK_POOL = 'pool:%s'
LOCK_SCRIPT = 'script:%s'
LOCK_SCRIPT_TYPE = 'script_type:%s'
LOCK_TYPE_ACCESS = 'type_access:%s'
LOCK_TYPE_NETWORK = 'type_network:%s'
LOCK_USER_GROUP = 'user_group:%s:%s'
LOCK_USER = 'user:%s'
LOCK_VLAN = 'vlan:%s'
LOCK_RACK = 'rack:%s'
LOCK_GET_IPV4_AVAILABLE = 'Ipv4_get_available_for_vip:%s'
LOCK_GET_IPV6_AVAILABLE = 'Ipv6_get_available_for_vip:%s'


# Adjusts settings
from django.core.cache import cache
from networkapi.distributedlock.memcachedlock import MemcachedLock

DEBUG = False
DEFAULT_TIMEOUT = 1200
DEFAULT_BLOCKING = True
DEFAULT_MEMCACHED_CLIENT = cache


[docs]def default_lock_factory(key): return MemcachedLock( key, DEFAULT_MEMCACHED_CLIENT, DEFAULT_TIMEOUT)
def _debug(msg): if DEBUG: print 'LOCK:', msg
[docs]class LockNotAcquiredError(Exception): pass
[docs]class distributedlock(object): def __init__(self, key=None, lock=None, blocking=None): self.key = key self.lock = lock if blocking is None: self.blocking = DEFAULT_BLOCKING else: self.blocking = blocking if not self.lock: self.lock = default_lock_factory(self.key) # for use with decorator def __call__(self, f): if not self.key: self.key = '%s:%s' % (f.__module__, f.__name__) def wrapped(*args, **kargs): with self: return f(*args, **kargs) return wrapped # for use with "with" block def __enter__(self): if not (type(self.key) == str or type(self.key) == unicode) and self.key == '': raise RuntimeError('Key not specified!') if self.lock.acquire(self.blocking): _debug('locking with key %s' % self.key) else: raise LockNotAcquiredError() def __exit__(self, type, value, traceback): _debug('releasing lock %s' % self.key) self.lock.release()