def ltm_build(): if change == 'change': try: ltm.pools.pool.create(name=pool_name, monitor=monitor) pool = ltm.pools.pool.load(name=pool_name) for node in nodes: ltm.nodes.node.create(partition='Common', name=node['name'], address=node['address']) pool.members_s.members.create(partition='Common', name=node['name'] + ':' + member_port) params = { 'name': vs_name, 'destination': f'{vip}:{port}', 'mask': '255.255.255.255', 'pool': pool_name, 'profiles': profiles, 'partition': 'Common', 'sourceAddressTranslation': { 'type': 'automap' }, } ltm.virtuals.virtual.create(**params) print('Build Complete...', '\n') time.sleep(1) virtual = ltm.virtuals.virtual.load(partition='Common', name=vs_name) virtual_stats = Stats(virtual.stats.load()) pool_stats = Stats(pool.stats.load()) print(f'Pool {pool_name} status:', pool_stats.stat.status_availabilityState['description']) print(f'Virtual Server {vs_name} status:', virtual_stats.stat.status_availabilityState['description']) except iControlUnexpectedHTTPError: print('Duplicate Objects Exist...Build Failed') sys.exit() elif change == 'rollback': try: virtual = ltm.virtuals.virtual.load(partition='Common', name=vs_name) virtual.delete() pool = ltm.pools.pool.load(name=pool_name) pool.delete() for node in nodes: ltm.nodes.node.load(partition='Common', name=node['name']).delete() print('Rollback Complete...') except iControlUnexpectedHTTPError: print( 'One of more objects couldn\'t be found...Rollback Failed...') sys.exit()
def check_node_connections(self, check_connections): """ Check if the number of connections in a node is 0""" for member in check_connections: node = self.conn.ltm.nodes.node.load(name=member.split(':')[0], partition='Common') node_stat = Stats(node.stats.load()) logging.info('Number of current connections on node {} = {}'.format(member, node_stat.stat.serverside_curConns.value)) while int(node_stat.stat.serverside_curConns.value) > 0: logging.info('Current Sessions of node {} is {}'.format(member, node_stat.stat.curSessions.value)) logging.info('Current Connections of node {} is {}'.format(member, node_stat.stat.serverside_curConns.value)) node = self.conn.ltm.nodes.node.load(name=member.split(':')[0], partition='Common') node_stat = Stats(node.stats.load()) logging.info('Sleeping for 30secs') time.sleep(30)
def is_deployed(self): try: res = self.client.api.tm.vcmp.guests.guest.load(name=self.want.name) stats = Stats(res.stats.load()) if stats.stat['requestedState']['description'] == 'deployed': if stats.stat['vmStatus']['description'] == 'running': return True except iControlUnexpectedHTTPError: pass return False
def get_pool_stats(self, mgmt, pool_name, part): #List for stats from all members output = [] """Return all pool stats object (dict of dicts)""" #load pool and member information pool_data = mgmt.tm.ltm.pools.pool.load(name=pool_name, partition=part) poolstats = pool_data.members_s.get_collection() for member in poolstats: #stats module needs to be used here to work with the stats.load() returned data output.append(Stats(member.stats.load())) return output
def get_pool_stats(self, pool): ''' HTTP GET an F5 pool by name in the /Common partition. Then load the pool members statistics and return them as a dictionary object. API Result: {'/Common/example-server': { 'addr': {'description': '2001:200:0:1300::100'}, 'connq_ageEdm': {'value': 0}, 'connq_ageEma': {'value': 0}, 'connq_ageHead': {'value': 0}, 'connq_ageMax': {'value': 0}, 'connq_depth': {'value': 0}, 'connq_serviced': {'value': 0}, 'curSessions': {'value': 0}, 'monitorRule': {'description': 'none'}, 'monitorStatus': {'description': 'unchecked'}, 'nodeName': {'description': '/Common/example-server}, 'poolName': {'description': '/Common/example-pool'}, 'port': {'value': 80}, 'serverside_bitsIn': {'value': 3998642720}, 'serverside_bitsOut': {'value': 869489671944}, 'serverside_curConns': {'value': 0}, 'serverside_maxConns': {'value': 121}, 'serverside_pktsIn': {'value': 6641290}, 'serverside_pktsOut': {'value': 72555193}, 'serverside_totConns': {'value': 98443}, 'sessionStatus': {'description': 'enabled'}, 'status_availabilityState': {'description': 'unknown'}, 'status_enabledState': {'description': 'enabled'}, 'status_statusReason': {'description': 'Pool member does not have service checking enabled'}, 'totRequests': {'value': 98443} }, ... ''' stats = {} my_pool = self.mgmt.tm.ltm.pools.pool.load(partition='Common', name=pool) my_pool_mbrs = my_pool.members_s.get_collection() for pool_mbr in my_pool_mbrs: mbr_stats = Stats(pool_mbr.stats.load()) # Create a new dictionary with the node name as the key dict_ = {mbr_stats.stat.nodeName.description: mbr_stats.stat} stats.update(dict_) # Return { node: node_stats_dict } to Robot Keyword logger.info(stats) return stats
def is_configured(self): """Checks to see if guest is disabled A disabled guest is fully disabled once their Stats go offline. Until that point they are still in the process of disabling. :return: """ try: res = self.client.api.tm.vcmp.guests.guest.load(name=self.want.name) Stats(res.stats.load()) return False except iControlUnexpectedHTTPError as ex: if 'Object not found - ' in str(ex): return True raise
def interface_stats(self, interface): ''' Load interface statistics given an interface name. Example: interface_stats('2.1') Return dictionary: {'counters_bitsIn': {'value': 41830832}, 'counters_bitsOut': {'value': 9579368}, 'counters_dropsAll': {'value': 7483}, 'counters_errorsAll': {'value': 0}, 'counters_pktsIn': {'value': 60724}, 'counters_pktsOut': {'value': 13908}, 'mediaActive': {'description': '10000LR-FD'}, 'tmName': {'description': '2.1'}, 'status': {'description': 'up'}} ''' interface = self.mgmt.tm.net.interfaces.interface.load(name=interface) interface_stats = Stats(interface.stats.load()) logger.info(interface_stats.stat) return interface_stats.stat
def available_vips(self): """ Shows VIP status as a pre-check """ existing_vips = virtuals.get_collection() vip_list = {} for item in existing_vips: vip_list[item.destination] = item.name print('I have found {0} VIPs '.format(len(vip_list))) print('*' * 100) for k, v in vip_list.items(): partition_split = k.split('/') partition = partition_split[1] vip = ltm.virtuals.virtual.load(name=v, partition=partition) vip_stats = Stats(vip.stats.load()) virt_server = vip_stats.stat['destination']['description'] status = vip_stats.stat['status_availabilityState']['description'] logger.info( 'Partition :{0:<15} VIP Name: {1:<45} VIP IP:{2:<35}Status: {3:<15}' .format(partition, v, virt_server, status))
def test_get_typed_pool_facts(self, *args): set_module_args(dict( include='pool', password='******', server='localhost', user='******' )) fixture1 = load_fixture('load_gtm_pool_a_collection.json') fixture2 = load_fixture('load_gtm_pool_a_example_stats.json') collection = [FakeARecord(attrs=x) for x in fixture1['items']] stats = Stats(FakeStatResource(fixture2['entries'])) client = AnsibleF5Client( argument_spec=self.spec.argument_spec, supports_check_mode=self.spec.supports_check_mode, f5_product_name=self.spec.f5_product_name ) # Override methods in the specific type of manager tfm = TypedPoolFactManager(client) tfm.read_collection_from_device = Mock(return_value=collection) tfm.read_stats_from_device = Mock(return_value=stats.stat) tm = PoolFactManager(client) tm.version_is_less_than_12 = Mock(return_value=False) tm.get_manager = Mock(return_value=tfm) # Override methods to force specific logic in the module to happen mm = ModuleManager(client) mm.get_manager = Mock(return_value=tm) mm.gtm_provisioned = Mock(return_value=True) results = mm.exec_module() assert results['changed'] is True assert 'pool' in results assert len(results['pool']) > 0 assert 'load_balancing_mode' in results['pool'][0]
def print_states(virtual_servers): print("") print("Virtual Server states:") for virt in virtual_servers: myvirt = mgmt.tm.ltm.virtuals.virtual.load(name=virt) if myvirt.to_dict().get("enabled"): confstate = "Enabled" txt_colour = "\033[32m" # Green elif myvirt.to_dict().get("disabled"): confstate = "Disabled" txt_colour = "\033[31m" # Red else: confstate = "UNKNOWN" txt_colour = "\033[34m" # Blue virtstats = Stats(myvirt.stats.load()) operstate = virtstats.stat['status_availabilityState']['description'] if operstate == 'offline': txt_colour = "\033[31m" # Red elif confstate != 'Disabled' and operstate == 'unknown': txt_colour = "\033[34m" # Blue print(f"- {virt}: {txt_colour}{confstate} ({operstate}) \033[0m") print("")
def HA_status(self,mgmt): x = Stats(mgmt.tm.cm.failover_status.load()) output = x.stat['status']['description'] return output
def get_pool_state(self, p_name, p_partition='Common'): """ Function to retrieve current pool availability status """ pool_stat = self.mgmt.tm.ltm.pools.pool.load(name=p_name, partition=p_partition) stats = Stats(pool_stat.stats.load()) return stats.stat.status_availabilityState['description']
def get_virtual_state(self, v_name, v_partition='Common'): """ Function to retrieve current virtual server availability status """ virtual_stat = self.mgmt.tm.ltm.virtuals.virtual.load( name=v_name, partition=v_partition) stats = Stats(virtual_stat.stats.load()) return stats.stat.status_availabilityState['description']
######################################################################### # title: Collect_Pool_Stats.py # # author: Dario Garrido # # date: 20200409 # # description: Collect Pool Stats from an already kwown Pool name # ######################################################################### from f5.bigip import ManagementRoot from f5.utils.responses.handlers import Stats # ---------------------------------------------------------- session = ManagementRoot("F5_mgmt_IP", "username", "password", token=True) pool = session.tm.ltm.pools.pool.load(name='testPool') # https:// <F5_mgmt_IP>/mgmt/tm/ltm/pool/testPool poolstats = Stats(pool.stats.load()) # https:// <F5_mgmt_IP>/mgmt/tm/ltm/pool/testPool/stats for key, value in poolstats.stat.items(): if value.get('description') != None: print("{}: {}".format(key, value.get('description'))) elif value.get('value') != None: print("{}: {}".format(key, value.get('value'))) # ----------------------------------------------------------
######################################################################### # title: Collect_VS_Stats.py # # author: Dario Garrido # # date: 20200409 # # description: Collect VS Stats from an already kwown VS name # ######################################################################### from f5.bigip import ManagementRoot from f5.utils.responses.handlers import Stats # ---------------------------------------------------------- session = ManagementRoot("F5_mgmt_IP", "username", "password", token=True) virtual = session.tm.ltm.virtuals.virtual.load(name='testVS') #https:// <F5_mgmt_IP>/mgmt/tm/ltm/virtual/testVS virtualstats = Stats(virtual.stats.load()) #https:// <F5_mgmt_IP>/mgmt/tm/ltm/virtual/testVS/stats for key, value in virtualstats.stat.items(): if value.get('description') != None: print("{}: {}".format(key, value.get('description'))) elif value.get('value') != None: print("{}: {}".format(key, value.get('value'))) # ----------------------------------------------------------
def read_stats_from_device(self, resource): stats = Stats(resource.stats.load()) return stats.stat
for pool in all_pools: for member in pool.members_s.get_collection(): for membadd in member_list: if member.address == membadd: print(pool.name + "," + member.name + ',' + member.address) poolmemblist.append(pool.name + "," + member.name + ',' + member.address) pool_list = [] # # for poolnam in poolmemblist: poolna = poolnam.split(',') #print(poolna[0]) my_pool = mgmt.tm.ltm.pools.pool.load(partition='Common', name=poolna[0]) pool_stats = Stats(my_pool.stats.load()) #print(pool_stats.stat.status_availabilityState) currm = pool_stats.stat.availableMemberCnt['value'] if currm <= 1 and action != 'enabled': print("pool : {} = pool_member 少於1 : {}".format(poolna[0], currm)) continue else: print("\t" + poolna[0] + "\t" + poolna[1]) pooln = mgmt.tm.ltm.pools.pool.load(name=poolna[0], partition='Common') pm1 = pooln.members_s.members.load(partition='Common', name=poolna[1]) if Dev_status in ["active"]: for member in [pm1]: if action == 'enabled': # enables member logger.info('enables member %s, previous state: %s' % (member.name, member.state))
#pmaddrsp1 = [i.split('|')[1] for i in pmaddrsp] if aabbcc in ["active"]: for i in pmaddrsp: try: pamaddrsp1 = i.split('|')[1] pamaddrsp0 = i.split('|')[0] if pamaddrsp1 in member_list: print("poolName :{} poomMember :{} poolMemberaddr: {}". format(pmname, pamaddrsp0, pamaddrsp1)) pooln = mgmt.tm.ltm.pools.pool.load(name=pmname, partition='Common') #pm1 = pooln.members_s.members.load(partition='Common', name=pamaddrsp0) member = pooln.members_s.members.load( partition='Common', name=pamaddrsp0) #my_pool = mgmt.tm.ltm.pools.pool.load(partition='Common', name=pmname) pool_stats = Stats(pooln.stats.load()) #print(pool_stats.stat.status_availabilityState) currm = pool_stats.stat.availableMemberCnt['value'] if action == 'enabled': # enables member logger.info( 'enables member %s, previous state: %s' % (member.name, member.state)) member.state = 'user-up' member.session = 'user-enabled' elif action == 'checked': # Checl online member stt = member.session #logger.info('checked online member %s, previous state: %s' % # (member.name, member.state)) print(
password = sys.argv[5] host_ip = sys.argv[1] fnames = sys.argv[2] poolnames = sys.argv[3] now = datetime.datetime.now() mgmt = ManagementRoot(host_ip, username, password, token=True) my_pool = mgmt.tm.ltm.pools.pool.load(partition='Common', name=(poolnames)) my_pool_mbrs = my_pool.members_s.get_collection() Count = 0 print("\n") print("\033[0;37;44m\tCurrent Run date and time : \033[0m") print(now.strftime("\033[0;37;45m\t%Y-%m-%d %H:%M:%S\t\t\033[0m")) for pool_mbr in my_pool_mbrs: mbr_stats = Stats(pool_mbr.stats.load()) dic_test = mbr_stats.stat.nodeName dic_test1 = dic_test['description'] dic_test2 = dic_test1.replace('/Common/', '') dic_btest = mbr_stats.stat.status_availabilityState dic_btest1 = dic_btest['description'] dic_ctest = mbr_stats.stat.serverside_curConns dic_ctest1 = dic_ctest['value'] dic_dtest = mbr_stats.stat.status_enabledState dic_dtest1 = dic_dtest['description'] Count = ((Count + 1)) #print ( "%s_%02d pool_member: [ %s ] 主機狀態 : %s 目前連線數 : \033[43m[ %s ]\033[0m" % (fnames, Count, dic_test2, dic_btest1, dic_ctest1) ) if (dic_btest1 == 'available' or dic_dtest1 != 'enabled' or dic_btest1 == 'offline'): if (dic_dtest1 == 'enabled' and dic_btest1 == 'available'): print(
u = list() for member in pool.members_s.get_collection(): test.append((member.name).encode("utf-8")) for line in r: for i in test: if line in i: s.append((pool.name).encode("utf-8")) break else: continue #print s #sample=list() for pool in pools: sample = list() man = list() for i in s: if pool.name not in i: continue else: print pool.name for member in pool.members_s.get_collection(): sample.append((member.name).encode("utf-8")) mbr_stats = Stats(member.stats.load()) # print(mbr_stats.stat.status_availabilityState['description']) print member.name, "STATE: ", mbr_stats.stat.status_availabilityState[ 'description'] # words = ["001","002"] if all('002' and '001' in i for i in sample): print "!!!NO REDUNDANT MEMBERS AVAILABLE!!!" '\n' else: print "***REDUNDANT MEMBERS AVAILABLE***" '\n'
member = poolna.members_s.get_collection() for nod_ip in member: ckip = nod_ip.address for node_list in member_list: if node_list in ckip: print("\t" + poolna.name + "\t" + nod_ip.name) pooln = mgmt.tm.ltm.pools.pool.load(name=poolna.name, partition='Common') pm1 = pooln.members_s.members.load(partition='Common', name=nod_ip.name) if aabbcc in ["active"]: for member in [pm1]: time.sleep(1) my_pool = mgmt.tm.ltm.pools.pool.load( partition='Common', name=poolna.name) pool_stats = Stats(my_pool.stats.load()) #print(pool_stats.stat.status_availabilityState) currm = pool_stats.stat.availableMemberCnt['value'] if currm <= 1: print(currm) continue else: if action == 'enabled': # enables member logger.info( 'enables member %s, previous state: %s' % (member.name, member.state)) member.state = 'user-up' member.session = 'user-enabled' elif action == 'disabled': # disables member
# REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Oscarob Wu([email protected]), # ORGANIZATION: # VERSION: 1.0 # Created Time: 2021-01-25 09:29:36 # Last modified: 2021-01-25 09:37 # REVISION: --- #=============================================================================== from f5.bigip import ManagementRoot from f5.utils.responses.handlers import Stats from pprint import pprint # Get login password from CLI F5_host = input('F5_Host: ') F5_user = input('Username: '******'Password: '******'Common', name='my_virtual') my_pool = mgmt.tm.ltm.pools.pool.load(partition='Common', name='my_pool') v_stats = Stats(my_virtual.stats.load()) p_stats = Stats(my_pool.stats.load()) pprint(v_stats.stat) pprint(p_stats.stat) print(v_stats.stat.status_availabilityState) print(p_stats.stat.status_availabilityState)