2014-07-24 2 views
-3

이 얻을 때 두 번째 패스를하지만, 올바른 값을 반환을 통해 나는 파이썬의 첫 번째 시간을 내 수업에 문제가있어에 : vm_return.vmPerf()어떻게 파이썬 클래스를 통해 루프

완전히 변수에서 닦아 초기화 클래스에 정의 된 모든 물건과 남아있는 모든입니다

passed_vm_mor 그것을 위해이

가 존재하지 않기 때문에 때 더 이상 개체를 찾을 수 없습니다 내가 그것을 두 번째로 부르는 것은 의미가 없습니다. 그것의 확률값하지만 내 부분에 그냥 오해 ..만큼 당신처럼

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() 
+0

이것은 내가 가져온 데이터의 전부가 아닙니다. 단지 단축했습니다 ... – PythonDevOps

+0

기본적으로 두 번째로 vmPerf가 호출되었으므로 더 이상 변수가 없으므로 객체가 사라져서 데이터를 가져올 수 없습니다. 어떻게 그것을 수정하여 그것을 통해 볼 수 있으며 항상 데이터를 반환 할 수 있습니다. – PythonDevOps

+1

1) 질문을 편집하고 그것에 의견을 쓰지 마십시오. 2)''__init__'' 메소드가 반환 된 후에도'self.passed_vm_mor' 이외의 것을 계속 사용하려고합니까? 현재, 모든 할당은 클래스 속성이 아닌 메소드 로컬 변수에 대한 것입니다. – aruisdante

답변

1

는 같은 것들을 : 당신은 항상 다음 호출에 실패 할 수 있습니다

self.vm_mor = self.vm._moId 

는 간단하기 때문에 지금 self.vm_mor는 ID를 포함 (_moId) 지금.

나는 당신이 그것을 수행하여 달성하고자 할 모르겠어요,하지만 할 더 나을 : 당신의 내부 변수에 "직접 액세스"를 갖고 싶어

self._moId = self.vm._moId 

self.vm_mor.

for vm_mor in cursor: 

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

서로 다른 v_mor의 다시하고 다시 vm_return를 오버라이드 (override) 유지 :

또한, 다음과 같은 루프에 있다고주의를 기울입니다.

+0

어떻게하면 클래스를 통해 VM의 mors를 반복하고 출력을해야합니까? 데이터베이스 쿼리의 각 mor에 대해 클래스를 전달하고 클래스는 해당 mor가 vcenter에 있는지 확인합니다. 다음 mor로 이동 한 다음 발견 될 때까지 반복하고 클래스 객체를 vm.object로 설정합니다 – PythonDevOps

+0

@PythonDevOps "... 찾을 때까지 반복 ..."- 아니요, 아무것도 남지 않을 때까지 계속 반복됩니다. – alfasin