+class FileLock:
+ FILE_LOCK = '/tmp/_openstack_prepare_vm.lock'
+ def __init__(self):
+ # This will create it if it does not exist already
+ self.filename = FileLock.FILE_LOCK
+ self.handle = None
+
+ # Bitwise OR fcntl.LOCK_NB if you need a non-blocking lock
+ def acquire(self):
+ logger.info("<PID: %d> Attempting to acquire log." %os.getpid())
+ self.handle = open(self.filename, 'w')
+ fcntl.flock(self.handle, fcntl.LOCK_EX)
+ logger.info("<PID: %d> Lock successfully acquired." %os.getpid())
+
+ def release(self):
+ fcntl.flock(self.handle, fcntl.LOCK_UN)
+ self.handle.close()
+ logger.info("<PID: %d> Released lock." %os.getpid())
+
+ def __del__(self):
+ if self.handle and self.handle.closed == False:
+ self.handle.close()
+
+
+def allocate_floating_ip(drv, argument):
+ #### Allocate a floating_ip
+ available_ip = [ ip for ip in drv.nova_floating_ip_list() if ip.instance_id == None ]
+
+ if argument.pool_name:
+ ### Filter further based on IP address
+ available_ip = [ ip for ip in available_ip if ip.pool == argument.pool_name ]
+
+ if not available_ip:
+ logger.info("<PID: %d> No free floating_ips available. Allocating fresh from pool: %s" %(os.getpid(), argument.pool_name))
+ pool_name = argument.pool_name if argument.pool_name is not None else None
+ floating_ip = drv.nova_floating_ip_create(pool_name)
+ else:
+ floating_ip = random.choice(available_ip)
+ logger.info("<PID: %d> Selected floating_ip: %s from available free pool" %(os.getpid(), floating_ip))
+
+ return floating_ip
+