def create_multipoint_tunnel(self, name=None, profile_name=None, self_ip_address=None, greid=0, description=None, folder='Common'): """ Create multipoint tunnel """ if not self.tunnel_exists(name=name, folder=folder): folder = str(folder).replace('/', '') payload = dict() payload['name'] = name payload['partition'] = folder payload['profile'] = profile_name payload['key'] = greid payload['localAddress'] = self_ip_address payload['remoteAddress'] = '0.0.0.0' if description: payload['description'] = description request_url = self.bigip.icr_url + '/net/tunnels/tunnel/' Log.info('L2GRE', 'creating tunnel with %s' % json.dumps(payload)) response = self.bigip.icr_session.post( request_url, data=json.dumps(payload), timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: if not folder == 'Common': self.bigip.route.add_vlan_to_domain( name=name, folder=folder) return True else: Log.error('L2GRE', response.text) raise exceptions.L2GRETunnelCreationException(response.text) return False
def create_multipoint_tunnel(self, name=None, profile_name=None, self_ip_address=None, greid=0, description=None, folder='Common'): if not self.tunnel_exists(name=name, folder=folder): folder = str(folder).replace('/', '') self.bigip.system.set_rest_folder(folder) payload = dict() payload['name'] = name payload['partition'] = folder payload['profile'] = profile_name payload['key'] = greid payload['localAddress'] = self_ip_address payload['remoteAddress'] = '0.0.0.0' if description: payload['description'] = description request_url = self.bigip.icr_url + '/net/tunnels/tunnel/' Log.info('L2GRE', 'creating tunnel with %s' % json.dumps(payload)) response = self.bigip.icr_session.post(request_url, data=json.dumps(payload), timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: if not folder == 'Common': self.bigip.route.add_vlan_to_domain( name=name, folder=folder) return True else: Log.error('L2GRE', response.text) raise exceptions.L2GRETunnelCreationException(response.text) return False
def add_peer(self, name, mgmt_ip_address, username, password): if not self.peer_exists(name): if self.bigip.device.get_lock(): local_device = self.get_local_device_name() local_mgmt_address = self.get_local_device_addr() root_mgmt_dict = { 'root_device_name': local_device, 'root_device_mgmt_address': local_mgmt_address } local_md = self.bigip.device.get_metadata() if 'root_device_name' in local_md.keys(): md_device_name = os.path.basename( local_md['root_device_name']) if md_device_name: if not md_device_name == local_device: raise exceptions.BigIPClusterPeerAddFailure( 'the device' \ + ' used to peer %s ' % name \ + ' was already itself peered from root' \ + ' device: %s' % local_md['root_device_name']) self.bigip.device.update_metadata(root_mgmt_dict) Log.info('Cluster', 'Device %s - adding peer %s' % (local_device, name)) self.mgmt_trust.add_authority_device(mgmt_ip_address, username, password, name, '', '', '', '') attempts = 0 while attempts < const.PEER_ADD_ATTEMPTS_MAX: if self.get_sync_status() == "OFFLINE": self.mgmt_trust.remove_device([name]) self.mgmt_trust.add_authority_device(mgmt_ip_address, username, password, name, '', '', '', '') else: self.bigip.device.release_lock() return time.sleep(const.PEER_ADD_ATTEMPT_DELAY) attempts += 1 else: raise exceptions.BigIPClusterPeerAddFailure( 'Could not add peer device %s' % name + ' as a trust for device %s' % os.path.basename(self.mgmt_dev.get_local_device()) + ' after % attempts' % const.PEER_ADD_ATTEMPTS_MAX ) else: raise exceptions.BigIPDeviceLockAcquireFailed( 'Unable to obtain device lock for device %s' % os.path.basename(self.mgmt_dev.get_local_device()) )
def add_peer(self, name, mgmt_ip_address, username, password): """ Add a peer to the local trust group """ if not self.peer_exists(name): if self.bigip.device.get_lock(): local_device = self.get_local_device_name() local_mgmt_address = self.get_local_device_addr() root_mgmt_dict = {'root_device_name': local_device, 'root_device_mgmt_address': local_mgmt_address} local_md = self.bigip.device.get_metadata() if local_md and 'root_device_name' in local_md.keys(): md_device_name = os.path.basename( local_md['root_device_name']) if md_device_name: if not md_device_name == local_device: raise exceptions.BigIPClusterPeerAddFailure( 'the device used to peer %s ' % name + ' was already itself peered from root' + ' device: %s' % local_md['root_device_name']) self.bigip.device.update_metadata(None, root_mgmt_dict) Log.info('Cluster', 'Device %s - adding peer %s' % (local_device, name)) self.mgmt_trust.add_authority_device(mgmt_ip_address, username, password, name, '', '', '', '') attempts = 0 while attempts < const.PEER_ADD_ATTEMPTS_MAX: if self.get_sync_status() == "OFFLINE": self.mgmt_trust.remove_device([name]) self.mgmt_trust.add_authority_device(mgmt_ip_address, username, password, name, '', '', '', '') else: self.bigip.device.release_lock() return time.sleep(const.PEER_ADD_ATTEMPT_DELAY) attempts += 1 else: raise exceptions.BigIPClusterPeerAddFailure( 'Could not add peer device %s' % name + ' as a trust for device %s' % os.path.basename(self.mgmt_dev.get_local_device()) + ' after % attempts' % const.PEER_ADD_ATTEMPTS_MAX) else: raise exceptions.BigIPDeviceLockAcquireFailed( 'Unable to obtain device lock for device %s' % os.path.basename(self.mgmt_dev.get_local_device()) )
def release_lock(self): current_lock = self._get_lock() if current_lock == self.lock: Log.info('Device', 'Releasing device lock for %s' % self.get_device_name()) self._set_lock(None) return True else: Log.info('Device', 'Device has foreign lock instance on %s ' % self.get_device_name() + ' with lock %s ' % current_lock) return False
def release_lock(self): current_lock = self._get_lock() if current_lock == self.lock: Log.info('Device', 'Releasing device lock for %s' % self.get_device_name()) self._set_lock(None) return True else: Log.info( 'Device', 'Device has foreign lock instance on %s ' % self.get_device_name() + ' with lock %s ' % current_lock) return False
def release_lock(self): self.bigip.system.set_folder('/Common') dev_name = self.mgmt_dev.get_local_device() current_lock = self._get_lock() if current_lock == self.lock: Log.info('Device', 'Releasing device lock for %s' % self.mgmt_dev.get_local_device()) self.mgmt_dev.set_comment([dev_name], ['']) return True else: Log.info('Device', 'Device has foreign lock instance on %s ' % self.mgmt_dev.get_local_device() + ' with lock %s ' % current_lock) return False
def get_lock(self): current_lock = self._get_lock() new_lock = int(time.time()) if current_lock: if (new_lock - current_lock) > const.CONNECTION_TIMEOUT: Log.info('Device', 'Locking device %s with lock %s' % (self.get_device_name(), new_lock)) self._set_lock(new_lock) return True else: return False else: Log.info('Device', 'Locking device %s with lock %s' % (self.get_device_name(), new_lock)) self._set_lock(int(time.time())) return True
def get_lock(self): current_lock = self._get_lock() new_lock = int(time.time()) self.bigip.system.set_folder('/Common') if current_lock: if (new_lock - current_lock) > const.CONNECTION_TIMEOUT: Log.info('Device', 'Locking device %s with lock %s' % (self.mgmt_dev.get_local_device(), new_lock)) self._set_lock(new_lock) return True else: return False else: Log.info('Device', 'Locking device %s with lock %s' % (self.mgmt_dev.get_local_device(), new_lock)) self._set_lock(int(time.time())) return True
def get_lock(self): current_lock = self._get_lock() new_lock = int(time.time()) if current_lock: if (new_lock - current_lock) > const.CONNECTION_TIMEOUT: Log.info( 'Device', 'Locking device %s with lock %s' % (self.get_device_name(), new_lock)) self._set_lock(new_lock) return True else: return False else: Log.info( 'Device', 'Locking device %s with lock %s' % (self.get_device_name(), new_lock)) self._set_lock(int(time.time())) return True
def sync(self, name, force_now=False): """ Ensure local device in sync with group """ sync_start_time = time.time() dev_name = self.get_local_device_name() sleep_delay = const.SYNC_DELAY attempts = 0 if force_now: self.sync_local_device_to_group(name) time.sleep(sleep_delay) attempts += 1 while attempts < const.MAX_SYNC_ATTEMPTS: state = self.get_sync_status() if state in ['Standalone', 'In Sync']: break elif state == 'Awaiting Initial Sync': attempts += 1 Log.info( 'Cluster', "Device %s - Synchronizing initial config to group %s" % (dev_name, name)) self.sync_local_device_to_group(name) time.sleep(sleep_delay) elif state in ['Disconnected', 'Not All Devices Synced', 'Changes Pending']: attempts += 1 last_log_time = 0 now = time.time() wait_start_time = now # Keep checking the sync state in a quick loop. # We want to detect In Sync as quickly as possible. while now - wait_start_time < sleep_delay: # Only log once per second if now - last_log_time >= 1: Log.info( 'Cluster', 'Device %s, Group %s not synced. ' % (dev_name, name) + 'Waiting. State is: %s' % state) last_log_time = now state = self.get_sync_status() if state in ['Standalone', 'In Sync']: break time.sleep(.5) now = time.time() else: # if we didn't break out due to the group being in sync # then attempt to force a sync. self.sync_local_device_to_group(name) sleep_delay += const.SYNC_DELAY # no need to sleep here because we already spent the sleep # interval checking status. continue # Only a break from the inner while loop due to Standalone or # In Sync will reach here. # Normal exit of the while loop reach the else statement # above which continues the outer loop break elif state == 'Sync Failure': Log.info('Cluster', "Device %s - Synchronization failed for %s" % (dev_name, name)) Log.debug('Cluster', 'SYNC SECONDS (Sync Failure): ' + str(time.time() - sync_start_time)) raise exceptions.BigIPClusterSyncFailure( 'Device service group %s' % name + ' failed after ' + '%s attempts.' % const.MAX_SYNC_ATTEMPTS + ' Correct sync problem manually' + ' according to sol13946 on ' + ' support.f5.com.') else: attempts += 1 Log.info('Cluster', "Device %s " % dev_name + "Synchronizing config attempt %s to group %s:" % (attempts, name) + " current state: %s" % state) self.sync_local_device_to_group(name) time.sleep(sleep_delay) sleep_delay += const.SYNC_DELAY else: if state == 'Disconnected': Log.debug('Cluster', 'SYNC SECONDS(Disconnected): ' + str(time.time() - sync_start_time)) raise exceptions.BigIPClusterSyncFailure( 'Device service group %s' % name + ' could not reach a sync state' + ' because they can not communicate' + ' over the sync network. Please' + ' check connectivity.') else: Log.debug('Cluster', 'SYNC SECONDS(Timeout): ' + str(time.time() - sync_start_time)) raise exceptions.BigIPClusterSyncFailure( 'Device service group %s' % name + ' could not reach a sync state after ' + '%s attempts.' % const.MAX_SYNC_ATTEMPTS + ' It is in %s state currently.' % state + ' Correct sync problem manually' + ' according to sol13946 on ' + ' support.f5.com.') Log.debug('Cluster', 'SYNC SECONDS(Success): ' + str(time.time() - sync_start_time))
def sync(self, name, force_now=False): sync_start_time = time.time() self.bigip.system.set_folder('/Common') dev_name = self.mgmt_dev.get_local_device() sleep_delay = const.SYNC_DELAY attempts = 0 if force_now: self.sys_sync.synchronize_to_group_v2(name, dev_name, True) time.sleep(sleep_delay) attempts += 1 while attempts < const.MAX_SYNC_ATTEMPTS: state = self.get_sync_status() if state in ['Standalone', 'In Sync', ]: break elif state == 'Awaiting Initial Sync': attempts += 1 Log.info('Cluster', "Device %s - Synchronizing initial config to group %s" % (dev_name, name)) self.sys_sync.synchronize_to_group_v2(name, dev_name, True) time.sleep(sleep_delay) elif state in ['Disconnected', 'Not All Devices Synced', 'Changes Pending', ]: attempts += 1 last_log_time = 0 now = time.time() wait_start_time = now # Keep checking the sync state in a quick loop. # We want to detect In Sync as quickly as possible. while now - wait_start_time < sleep_delay: # Only log once per second if now - last_log_time >= 1: Log.info('Cluster', 'Device %s, Group %s not synced. ' % (dev_name, name) + \ 'Waiting. State is: %s' % state) last_log_time = now state = self.get_sync_status() if state in ['Standalone', 'In Sync', ]: break time.sleep(.5) now = time.time() else: # if we didn't break out due to the group being in sync # then attempt to force a sync. self.sys_sync.synchronize_to_group_v2(name, dev_name, True) sleep_delay += const.SYNC_DELAY # no need to sleep here because we already spent the sleep # interval checking status. continue # Only a break from the inner while loop due to Standalone or # In Sync will reach here. # Normal exit of the while loop reach the else statement # above which continues the outer loop break elif state == 'Sync Failure': Log.info('Cluster', "Device %s - Synchronization failed for %s" % (dev_name, name)) Log.debug('Cluster', 'SYNC SECONDS (Sync Failure): ' + \ str(time.time() - sync_start_time)) raise BigIPClusterSyncFailure( 'Device service group %s' % name + \ ' failed after ' + \ '%s attempts.' % const.MAX_SYNC_ATTEMPTS + \ ' Correct sync problem manually' + \ ' according to sol13946 on ' + \ ' support.f5.com.') else: attempts += 1 Log.info('Cluster', "Device %s " % dev_name \ + "Synchronizing config attempt %s to group %s:" % (attempts, name) \ + " current state: %s" % state) self.sys_sync.synchronize_to_group_v2(name, dev_name, True) time.sleep(sleep_delay) sleep_delay += const.SYNC_DELAY else: if state == 'Disconnected': Log.debug('Cluster', 'SYNC SECONDS(Disconnected): ' + \ str(time.time() - sync_start_time)) raise BigIPClusterSyncFailure( 'Device service group %s' % name + \ ' could not reach a sync state' + \ ' because they can not communicate' + \ ' over the sync network. Please' + \ ' check connectivity.') else: Log.debug('Cluster', 'SYNC SECONDS(Timeout): ' + \ str(time.time() - sync_start_time)) raise BigIPClusterSyncFailure( 'Device service group %s' % name + \ ' could not reach a sync state after ' + \ '%s attempts.' % const.MAX_SYNC_ATTEMPTS + \ ' It is in %s state currently.' % state + \ ' Correct sync problem manually' + \ ' according to sol13946 on ' + \ ' support.f5.com.') Log.debug('Cluster', 'SYNC SECONDS(Success): ' + \ str(time.time() - sync_start_time))