def _ips_exist_on_subnet(self, 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? folder = self.service_adapter.get_folder_name( service['loadbalancer']['tenant_id'] ) virtual_services = self.network_helper.get_virtual_service_insertion( bigip, partition=folder ) 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? nodes = self.network_helper.get_node_addresses( bigip, partition=folder ) 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 _ips_exist_on_subnet(self, 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? folder = self.service_adapter.get_folder_name( service['loadbalancer']['tenant_id'] ) virtual_services = self.network_helper.get_virtual_service_insertion( bigip, partition=folder ) 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? nodes = self.network_helper.get_node_addresses( bigip, partition=folder ) 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 test_strip_domain_address_mask(self): domain = utils.strip_domain_address('192.168.1.1%20/24') assert domain == "192.168.1.1/24"
def test_strip_domain_address_no_mask(self): addr = utils.strip_domain_address("192.168.1.1%20") assert addr == '192.168.1.1'
def get_stats(self, service): """Get service stats""" # use pool stats because the pool_id is the # the service definition... stats = {} stats[lb_const.STATS_IN_BYTES] = 0 stats[lb_const.STATS_OUT_BYTES] = 0 stats[lb_const.STATS_ACTIVE_CONNECTIONS] = 0 stats[lb_const.STATS_TOTAL_CONNECTIONS] = 0 # add a members stats return dictionary members = {} for hostbigip in self.get_all_bigips(): # It appears that stats are collected for pools in a pending delete # state which means that if those messages are queued (or delayed) # it can result in the process of a stats request after the pool # and tenant are long gone. Check if the tenant exists. if not service['pool'] or not hostbigip.system.folder_exists( OBJ_PREFIX + service['pool']['tenant_id']): return None pool = service['pool'] pool_stats = hostbigip.pool.get_statistics( name=pool['id'], folder=pool['tenant_id'], config_mode=self.conf.icontrol_config_mode) if 'STATISTIC_SERVER_SIDE_BYTES_IN' in pool_stats: stats[lb_const.STATS_IN_BYTES] += \ pool_stats['STATISTIC_SERVER_SIDE_BYTES_IN'] stats[lb_const.STATS_OUT_BYTES] += \ pool_stats['STATISTIC_SERVER_SIDE_BYTES_OUT'] stats[lb_const.STATS_ACTIVE_CONNECTIONS] += \ pool_stats['STATISTIC_SERVER_SIDE_CURRENT_CONNECTIONS'] stats[lb_const.STATS_TOTAL_CONNECTIONS] += \ pool_stats['STATISTIC_SERVER_SIDE_TOTAL_CONNECTIONS'] # are there members to update status if 'members' in service: # only query BIG-IP pool members if they # not in a state indicating provisioning or error # provisioning the pool member some_members_require_status_update = False update_if_status = [plugin_const.ACTIVE, plugin_const.DOWN, plugin_const.INACTIVE] if plugin_const.ACTIVE not in update_if_status: update_if_status.append(plugin_const.ACTIVE) for member in service['members']: if member['status'] in update_if_status: some_members_require_status_update = True # are we have members who are in a # state to update there status if some_members_require_status_update: # query pool members on each BIG-IP monitor_states = \ hostbigip.pool.get_members_monitor_status( name=pool['id'], folder=pool['tenant_id'], config_mode=self.conf.icontrol_config_mode ) for member in service['members']: if member['status'] in update_if_status: # create the entry for this # member in the return status # dictionary set to ACTIVE if not member['id'] in members: members[member['id']] = \ {'status': plugin_const.INACTIVE} # check if it down or up by monitor # and update the status for state in monitor_states: # matched the pool member # by address and port number if member['address'] == \ strip_domain_address( state['addr']) and \ int(member['protocol_port']) == \ int(state['port']): # if the monitor says member is up if state['state'] == \ 'MONITOR_STATUS_UP' or \ state['state'] == \ 'MONITOR_STATUS_UNCHECKED': # set ACTIVE as long as the # status was not set to 'DOWN' # on another BIG-IP if members[ member['id']]['status'] != \ 'DOWN': if member['admin_state_up']: members[member['id']][ 'status'] = \ plugin_const.ACTIVE else: members[member['id']][ 'status'] = \ plugin_const.INACTIVE else: members[member['id']]['status'] = \ plugin_const.DOWN stats['members'] = members return stats
def test_strip_domain_address_mask(self): domain = utils.strip_domain_address('192.168.1.1%20/24') assert domain == "192.168.1.1/24"
def test_strip_domain_address_no_mask(self): addr = utils.strip_domain_address("192.168.1.1%20") assert addr == '192.168.1.1'