def get_fdb_entry(self, tunnel_name=None, mac=None, folder='Common'): """ Add fdb entry for a tunnel """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/fdb/tunnel/' request_url += '~' + folder + '~' + tunnel_name response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: response_obj = json.loads(response.text) if 'records' in response_obj: if not mac: return_fdbs = [] for fdb in response_obj['records']: fdb['endpoint'] = strip_domain_address(fdb['endpoint']) return_fdbs.append(fdb) return return_fdbs else: for record in response_obj['records']: if record['name'] == mac: record['endpoint'] = strip_domain_address( record['endpoint']) return record elif response.status_code != 404: Log.error('L2GRE', response.text) raise exceptions.L2GRETunnelQueryException(response.text) return []
def get_fdb_entry(self, tunnel_name=None, mac=None, folder='Common'): """ Get vxlan fdb entry """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/fdb/tunnel/' request_url += '~' + folder + '~' + tunnel_name response = self.bigip.icr_session.get(request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: response_obj = json.loads(response.text) if 'records' in response_obj: if not mac: return_fdbs = [] for fdb in response_obj['records']: fdb['endpoint'] = strip_domain_address(fdb['endpoint']) return_fdbs.append(fdb) return return_fdbs else: for record in response_obj['records']: if record['name'] == mac: record['endpoint'] = strip_domain_address( record['endpoint']) return record elif response.status_code != 404: Log.error('VXLAN', response.text) raise exceptions.VXLANQueryException(response.text) return []
def get_members_monitor_status(self, name=None, folder='Common'): if name: folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/ltm/pool/' request_url += '~' + folder + '~' + name request_url += '/members?$select=name,state' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) members = [] if response.status_code < 400: return_obj = json.loads(response.text) if 'items' in return_obj: for member in return_obj['items']: name_parts = member['name'].split(":") member_state = 'MONITOR_STATUS_' + \ member['state'].upper() members.append({ 'addr': strip_domain_address(name_parts[0]), 'port': name_parts[1], 'state': member_state }) else: Log.error('pool', response.text) raise exceptions.PoolQueryException(response.text) return members return None
def set_mask(self, name=None, netmask=None, folder='Common'): """ Set selfip netmask """ if name: folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/self/' request_url += '~' + folder + '~' + name request_url += '?$select=address' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) try: address = self._strip_mask(return_obj['address']) net = netaddr.IPNetwork( strip_domain_address(address) + '/' + netmask) payload = dict() payload['address'] = address + '/' + str(net.prefixlen) request_url = self.bigip.icr_url + '/net/self/' request_url += '~' + folder + '~' + name response = self.bigip.icr_session.put( request_url, data=json.dumps(payload), timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return True else: Log.error('self', response.text) raise exceptions.SelfIPUpdateException(response.text) except Exception as e: Log.error('self', 'set_mask exception:' + e.message) else: Log.error('self', response.text) raise exceptions.SelfIPQueryException(response.text) return False
def get_members_monitor_status(self, name=None, folder='Common'): if name: folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/ltm/pool/' request_url += '~' + folder + '~' + name request_url += '/members?$select=name,state' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) members = [] if response.status_code < 400: return_obj = json.loads(response.text) if 'items' in return_obj: for member in return_obj['items']: name_parts = member['name'].split(":") member_state = 'MONITOR_STATUS_' + \ member['state'].upper() members.append( {'addr': strip_domain_address(name_parts[0]), 'port': name_parts[1], 'state': member_state}) else: Log.error('pool', response.text) raise exceptions.PoolQueryException(response.text) return members return None
def _ips_exist_on_subnet(bigip, service, subnet, route_domain): """ Does the big-ip have any IP addresses on this subnet? """ LOG.debug("_ips_exist_on_subnet entry %s rd %s" % (str(subnet['cidr']), route_domain)) route_domain = str(route_domain) ipsubnet = netaddr.IPNetwork(subnet['cidr']) # Are there any virtual addresses on this subnet? get_vs = bigip.virtual_server.get_virtual_service_insertion virtual_services = get_vs(folder=service['pool']['tenant_id']) for virt_serv in virtual_services: (_, dest) = virt_serv.items()[0] LOG.debug(" _ips_exist_on_subnet: checking vip %s" % str(dest['address'])) if len(dest['address'].split('%')) > 1: vip_route_domain = dest['address'].split('%')[1] else: vip_route_domain = '0' if vip_route_domain != route_domain: continue vip_addr = strip_domain_address(dest['address']) if netaddr.IPAddress(vip_addr) in ipsubnet: LOG.debug(" _ips_exist_on_subnet: found") return True # If there aren't any virtual addresses, are there # node addresses on this subnet? get_node_addr = bigip.pool.get_node_addresses nodes = get_node_addr(folder=service['pool']['tenant_id']) for node in nodes: LOG.debug(" _ips_exist_on_subnet: checking node %s" % str(node)) if len(node.split('%')) > 1: node_route_domain = node.split('%')[1] else: node_route_domain = '0' if node_route_domain != route_domain: continue node_addr = strip_domain_address(node) if netaddr.IPAddress(node_addr) in ipsubnet: LOG.debug(" _ips_exist_on_subnet: found") return True LOG.debug(" _ips_exist_on_subnet exit %s" % str(subnet['cidr'])) # nothing found return False
def get_arps(self, ip_address=None, folder='Common'): """ Get ARP static entry """ folder = str(folder).replace('/', '') if ip_address: request_url = self.bigip.icr_url + '/net/arp/' request_url += '~' + folder + '~' + urllib.quote( self._remove_route_domain_zero(ip_address)) response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) Log.debug('ARP::get response', '%s' % response.json()) if response.status_code < 400: response_obj = json.loads(response.text) return [ {strip_domain_address(response_obj['name']): response_obj['macAddress']} ] else: Log.error('ARP', response.text) raise exceptions.StaticARPQueryException(response.text) else: request_url = self.bigip.icr_url + '/net/arp' request_filter = 'partition eq ' + folder request_url += '?$filter=' + request_filter response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) Log.debug('ARP::get response', '%s' % response.json()) if response.status_code < 400: response_obj = json.loads(response.text) if 'items' in response_obj: arps = [] for arp in response_obj['items']: arps.append( {strip_domain_address(arp['name']): arp['macAddress']} ) return arps else: Log.error('ARP', response.text) raise exceptions.StaticARPQueryException(response.text) return []
def get_arps(self, ip_address=None, folder='Common'): """ Get ARP static entry """ folder = str(folder).replace('/', '') if ip_address: request_url = self.bigip.icr_url + '/net/arp/' request_url += '~' + folder + '~' + urllib.quote( self._remove_route_domain_zero(ip_address)) response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) Log.debug('ARP::get response', '%s' % response.json()) if response.status_code < 400: response_obj = json.loads(response.text) return [{ strip_domain_address(response_obj['name']): response_obj['macAddress'] }] else: Log.error('ARP', response.text) raise exceptions.StaticARPQueryException(response.text) else: request_url = self.bigip.icr_url + '/net/arp' request_filter = 'partition eq ' + folder request_url += '?$filter=' + request_filter response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) Log.debug('ARP::get response', '%s' % response.json()) if response.status_code < 400: response_obj = json.loads(response.text) if 'items' in response_obj: arps = [] for arp in response_obj['items']: arps.append({ strip_domain_address(arp['name']): arp['macAddress'] }) return arps else: Log.error('ARP', response.text) raise exceptions.StaticARPQueryException(response.text) return []
def get_addr(self, name=None, folder='Common'): """ Get selfip addr """ folder = str(folder).replace('/', '') if name: request_url = self.bigip.icr_url + '/net/self/' request_url += '~' + folder + '~' + name request_url += '?$select=address' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) return strip_domain_address( self._strip_mask(return_obj['address'])) elif response.status_code != 404: Log.error('self', response.text) raise exceptions.SelfIPQueryException(response.text) return None
def get_snat_ipaddress(self, folder='Common', snataddress_name=None): """ Get SNAT IP by snataddress_name """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url request_url += '/ltm/snat-translation/~' + folder request_url += '~' + snataddress_name request_url += '?$select=address' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) if 'address' in return_obj: return strip_domain_address(return_obj['address']) elif response.status_code != 404: Log.error('snat-translation', response.text) raise exceptions.SNATQueryException(response.text) return None
def get_snat_ipaddress(self, folder='Common', snataddress_name=None): """ Get SNAT IP by snataddress_name """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url request_url += '/ltm/snat-translation/~' + folder request_url += '~' + snataddress_name request_url += '?$select=address' response = self.bigip.icr_session.get(request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) if 'address' in return_obj: return strip_domain_address(return_obj['address']) elif response.status_code != 404: Log.error('snat-translation', response.text) raise exceptions.SNATQueryException(response.text) return None
def get_original_addr(self, name=None, folder='Common'): """ Get NAT original addr """ if name: folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/ltm/nat/' request_url += '~' + folder + '~' + name request_url += '/?$select=originatingAddress' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) if 'originatingAddress' in return_obj: return strip_domain_address( return_obj['originatingAddress']) else: Log.error('nat', response.text) raise exceptions.NATQueryException(response.text) return None
def get_addrs(self, folder='Common'): """ Get selfip addrs """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/self/' request_url += '?$select=address' request_filter = 'partition eq ' + folder request_url += '&$filter=' + request_filter response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) return_list = [] if response.status_code < 400: return_obj = json.loads(response.text) if 'items' in return_obj: for selfip in return_obj['items']: return_list.append(strip_domain_address( self._strip_mask(selfip['address']))) elif response.status_code != 404: Log.error('self', response.text) raise exceptions.SelfIPQueryException(response.text) return return_list
def get_original_addrs(self, folder='Common'): """ Get NAT original addrs """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/ltm/nat' request_url += '?$select=originatingAddress' request_url += '&$filter=partition eq ' + folder response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) orig_addresses = [] if response.status_code < 400: return_obj = json.loads(response.text) if 'items' in return_obj: for nat in return_obj['items']: nat_orig = strip_domain_address(nat['originatingAddress']) orig_addresses.append(nat_orig) else: Log.error('nat', response.text) raise exceptions.NATQueryException(response.text) return orig_addresses
def get_mask(self, name=None, folder='Common'): """ Get selfip netmask """ if name: folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/self/' request_url += '~' + folder + '~' + name request_url += '?$select=address' response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) if response.status_code < 400: return_obj = json.loads(response.text) try: net = netaddr.IPNetwork( strip_domain_address(return_obj['address'])) return str(net.netmask) except Exception as e: Log.error('self', 'get_mask exception:' + e.message) elif response.status_code != 404: Log.error('self', response.text) raise exceptions.SelfIPQueryException(response.text) return None
def get_floating_addrs(self, prefix=None, folder='Common'): """ Set selfip floating addresses """ folder = str(folder).replace('/', '') request_url = self.bigip.icr_url + '/net/self/' request_url += '?$select=trafficGroup,floating,address' request_filter = 'partition eq ' + folder request_url += '&$filter=' + request_filter response = self.bigip.icr_session.get( request_url, timeout=const.CONNECTION_TIMEOUT) floats = [] if response.status_code < 400: return_obj = json.loads(response.text) if 'items' in return_obj: for selfip in return_obj['items']: if selfip['floating'] == 'enabled': floats.append(strip_domain_address( self._strip_mask(selfip['address']))) else: Log.error('self', response.text) raise exceptions.SelfIPQueryException(response.text) return floats