Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
    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())
                    )
Пример #4
0
    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())
                    )
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
    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
Пример #10
0
    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
Пример #11
0
    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))
Пример #12
0
    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))