当前位置: 动力学知识库 > 问答 > 编程问答 >

How to loop through a python class

问题描述:

I'm having issues with my class in python the first time through it will return the correct values, however on the second pass when it gets to:

vm_return.vmPerf()

all of the stuff that was defined in the init class is completely wiped from variables and all that remains is:

passed_vm_mor

there for it can't find the object because it doesn't exist anymore when i call it the second time it doesn't make any sense. Its prob just a misunderstanding on my part though..

import atexit

from pyVim.connect import SmartConnect, Disconnect

from pyVmomi import vim

import sys

import time

#globals

passed_vm_mor = ''

class getVM(object):

def __init__(self, passed_vm_mor):

self.passed_vm_mor = passed_vm_mor

vcenter_connection = SmartConnect(host = hostname,user = username,pwd = password)

atexit.register(Disconnect, vcenter_connection)

content = vcenter_connection.RetrieveContent()

perf_dict = {}

perfList = content.perfManager.perfCounter

for counter in perfList: #build the vcenter counters for the objects

counter_full = "{}.{}.{}".format(counter.groupInfo.key,counter.nameInfo.key,counter.rollupType)

perf_dict[counter_full] = counter.key

viewType = [vim.VirtualMachine]

props = ['name','runtime.powerState', 'datastore']

specType = vim.VirtualMachine

objView = content.viewManager.CreateContainerView(content.rootFolder,viewType,True)

tSpec = vim.PropertyCollector.TraversalSpec(name = 'tSpecName', path = 'view', skip = False, type = vim.view.ContainerView)

pSpec = vim.PropertyCollector.PropertySpec(all = False, pathSet = props,type = specType)

oSpec = vim.PropertyCollector.ObjectSpec(obj = objView,selectSet = [tSpec],skip = False)

pfSpec = vim.PropertyCollector.FilterSpec(objectSet = [oSpec], propSet = [pSpec], reportMissingObjectsInResults = False)

vm_properties = content.propertyCollector.RetrieveProperties(specSet = [pfSpec])

objView.Destroy()

for vm_property in vm_properties: #loop through the list built from vcenter and build dictonaries.

property_dic = {}

for prop in vm_property.propSet:

property_dic[prop.name] = prop.val

vm = vm_property.obj

vm_mor = vm._moId

if self.passed_vm_mor == vm_mor:

self.vm = vm_property.obj

else:

continue

def vmPerf(self):

self.vm_mor = self.vm._moId

self.bootOptionsSupported = self.vm.capability.bootOptionsSupported

self.bootRetryOptionsSupported = self.vm.capability.bootRetryOptionsSupported

self.changeTrackingSupported = self.vm.capability.changeTrackingSupported

self.consolePreferencesSupported = self.vm.capability.consolePreferencesSupported

cursor = db.cursor()

customer_id=24

sql = ('''select a.vm_mor from vms a, vm_groups b, customers c where c.customer_id = %d and c.customer_id = b.customer_id and b.vm_group_id = a.vm_group_id ''') % customer_id

cursor.execute(sql)

for vm_mor in cursor:

vm_return = getVM(vm_mor[0])

vm_return.vmPerf()

网友答案:

As long as you do things like:

self.vm_mor = self.vm._moId

you'll always fail on the next call simply because now self.vm_mor contains only an id (_moId) now.

I'm not sure what do you want to achieve by doing it, but it would make more sense to do:

self._moId = self.vm._moId

if you want to have a "direct access" to the inner variables of self.vm_mor.

Further, pay attention that in the following loop:

for vm_mor in cursor:

     vm_return = getVM(vm_mor[0])
     vm_return.vmPerf()

you keep overriding vm_return again and again with different v_mors.

分享给朋友:
您可能感兴趣的文章:
随机阅读: