Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 13, 2013 10:11:58

bohrman
Зарегистрирован: 2013-04-13
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

PySphere - продолжить получение данных после обрыва сети.

Добрый день.

Имеется код, для работы с виртуальными машинами 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version