Форум сайта python.su
Добрый день.
Имеется код, для работы с виртуальными машинами VMware vSphere.
Задача следующая:
Из VMware vSphere получить список ВМ. В цикле для каждой машины получить ее свойство(ОС, имя, сеть и т.д.). Полученные свойства будут записываться в БД.
Проблема:
Связь между сервером vSphere и клиентом, где будет запускаться скрипт, часто рвется. Подключение и цикл по извлечению ВМ приходиться начинать заново, что довольно проблематично, так как ВМ очень много и этот процесс может занимать продолжительное время, и есть вероятность что за это время может случиться очередной обрыв связи.
Как можно средствами python сделать что бы после обрыва и подключения к серверу продолжить с того момента где был обрыв?
# -*- coding: latin-1 -*- import os import sys import time import logging import logging.config from pysphere import VIServer from pysphere import VIException from collections import Iterable as ITER #-- Logging --# logging.config.fileConfig('log.conf') logging.getLogger('pysphere').setLevel('DEBUG') #-- VMWare SPHERE --# g_HOST = 'ip_address' g_LOGIN = 'user' g_PW = 'password' #-- Global variables for count --# g_SLEEP_INTERVAL = 10 g_COUNTDOWN = 5 def timer(func): def wrapper(*args, **kwargs): start_time = time.time() foo = func(*args, **kwargs) print '\n', '--' * 40 print '\n--Run-time functions: %d sec.' % (time.time() - start_time) return foo return wrapper def connection(sql_query): pass def set_query(property, network, status): '''def set_query: Query for DB ''' query = "execute procedure CHECKS_MAKETS ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}');".format( property.get('real_name'), property.get('alias_name'), property.get('OS'), property.get('parent_folder'), ';'.join(network.get('IP', 'None')), ';'.join(network.get('VLAN', 'None')), status.get('STATUS') ) connection(query) class GetInfoVM(object): '''class GetInfoVM: Get VM list from vSphere then list start in cycle then each item get property of VM: Property: Property['alias_name'] Property['real_name'] Property['OS'] Property['parent_folder'] Network: Network['IP'] Network['VLAN'] Status: Status['STATUS'] convert for SQL Base: PowerOff is 0 PowerOn is 1 and run func: set_query(Property, Network, Status) USAGE: >>> get_prop = GetInfoVM() >>> get_prop.get_VMList() >>> get_prop.server.disconnect() ''' def __init__(self): self.server = VIServer() self.server.connect(g_HOST, g_LOGIN, g_PW) self.vm_list = self.server.get_registered_vms() def get_VMList(self): '''def get_VMList: Get VM list for TVCenter ''' for vm_path in self.vm_list: vm = self.server.get_vm_by_path(vm_path) Property = self.__get_property(vm) Network = self.__get_network(vm) Status = self.__get_status(vm) ###--- Launch function create query for DB ---### set_query(Property, Network, Status) logging.info('All data were processed') def __get_property(self, vm): '''def __get_property: Get Property of VM ''' Property = {} Property['alias_name'] = vm.__get_property('name', from_cache=False) Property['real_name'] = os.path.basename(vm.__get_property('path')) Property['OS'] = vm.__get_property('guest_full_name', from_cache=False) Property['parent_folder'] = vm.properties.parent.name.decode('utf-8').encode('cp1251') return Property def __get_network(self,vm): '''def __get_network: Get network properties of VM: get IP address and get Vlan id''' Network = {} net = vm.__get_property('net', from_cache=False) if isinstance(net, ITER): extract = lambda x: x[0] if x else 'None' IP_addr = [extract(ip.get('ip_addresses')) for ip in net] Vlan_name = [str(vln.get('network', 'None')) for vln in net] else: IP_addr = ['None'] Vlan_name = ['None'] Network['IP'] = IP_addr Network['VLAN'] = Vlan_name return Network def __get_status(self, vm): '''def __get_status: Get status of VM: is POWERED OFF VM or is POWERED ON VM''' Status = {} status_vm = vm.__get_status() if status_vm == 'POWERED OFF': Status['STATUS'] = 0 # for sql trigger elif status_vm == 'POWERED ON': Status['STATUS'] = 1 # for sql trigger return Status @timer def main(count): count += 1 try: get_prop = GetInfoVM() except VIException as ex: logging.error('%s' % ex) logging.info('Sleep %s seconds' % g_SLEEP_INTERVAL) time.sleep(g_SLEEP_INTERVAL) logging.info('Try again, attempt number - %s' % count) if count == g_COUNTDOWN: logging.error('Exceed the number of requests. Program exits with code [1]') sys.exit(1) main(count) else: logging.info('Connect to vSphere is successfully') try: get_prop.get_VMList() except (VIException, Exception) as ex: logging.error('%s' % ex) logging.info('Sleep %s seconds' % g_SLEEP_INTERVAL) time.sleep(g_SLEEP_INTERVAL) logging.info('Try again, attempt number - %s' % count) if count == g_COUNTDOWN: logging.error('Exceed the number of requests. Program exits with code [1]') sys.exit(1) main(count) get_prop.server.disconnect() logging.info('Disconnect from vSphere') if __name__ == '__main__': main(0)
Отредактировано bohrman (Апрель 13, 2013 10:14:51)
Офлайн