1

我的程序的目标是解析从 oracle 数据库返回的一些信息。然后,当它解析这些信息时,构建一个 pickle 字典,以使用 pysphere 模块将数据插入到 vCenter vm.object 中。但是,目前我在尝试将注释保存到使用 vm_mor 标识符设置的用户集 vm_object 时遇到了一个问题。在我循环浏览 VM 属性之前它工作正常,但现在我试图搜索通过 VM-mor 我有问题我会发布它的工作方式和我想要的方式,但它不工作。

这是它不起作用的方式和我得到的错误代码:

import cx_Oracle
import datetime
from decimal import *
from pysphere import VIServer, MORTypes, VIProperty, VIMor
from pysphere.resources import VimService_services as VI
from pysphere.vi_virtual_machine import VIVirtualMachine
import pickle
import sys
import time

vc = VIServer()
vc.connect(hostname,username,password, trace_file="debug.txt")

properties = ['config.name', 'config.annotation']
licenses_list = []
license_built_list = []

def change_annotation(vm_mor, new_annotation):
    request = VI.ReconfigVM_TaskRequestMsg()
    _this = request.new__this(vm_mor)
    _this.set_attribute_type(vm_mor.get_attribute_type())
    request.set_element__this(_this)

    spec = request.new_spec()
    spec.set_element_annotation(new_annotation)
    request.set_element_spec(spec)
    vc._proxy.ReconfigVM_Task(request)

oracle = cx_Oracle.connect()
cursor = oracle.cursor()
cursor_guestos = oracle.cursor()

select_customer = ( ''' ''')

cursor.execute(select_customer)
for value in cursor:
   licenses_list.append(value)


for index, value in enumerate(licenses_list):
   customer_id = value[0]
   vm_mor = value[1]
   vm_id = value[2]
   license_id = value[3]
   product = value[4]
   guest_os_id = 0

   sql_guest_os = (''' ''')%int(vm_id)
   cursor_guestos.execute(sql_guest_os)

   for guest_os_id in cursor_guestos:
      guest_os_id = guest_os_id[0]

   if licenses_list[index][2] == licenses_list[index+1][2]:     
      license_built_list.append((licenses_list[index][4], licenses_list[index][3]))
      continue     
   else:
      license_built_list.append((licenses_list[index][4], licenses_list[index][3]))       


   pickle_dict = {"license":license_built_list, "customer_id":customer_id, "guest_os":guest_os_id}
   pickle.dump( pickle_dict, open( vm_mor, "wb" ) )
   annotation = vm_mor

   vm_mor_query =  VIMor(str(vm_mor), MORTypes.VirtualMachine)
   try:
      vm = VIVirtualMachine(vc, vm_mor_query)
   except:
      continue
   change_annotation(vm, annotation) #this is where it breaks.

   pickle_dict = {}
   annotation = {}
   vm_mor = {}
   license_built_list=[]




Traceback (most recent call last):
  File "/home/grant/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.4.1.201403181715/pysrc/pydevd.py", line 1844, in <module>
    debugger.run(setup['file'], None, None)
  File "/home/grant/.eclipse/org.eclipse.platform_3.8_155965261/plugins/org.python.pydev_3.4.1.201403181715/pysrc/pydevd.py", line 1372, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/home/grant/workspace/Metering/metering-home/push-annotation-pickle.py", line 96, in <module>
    change_annotation(vm, annotation)
  File "/home/grant/workspace/Metering/metering-home/push-annotation-pickle.py", line 25, in change_annotation
    _this.set_attribute_type(vm_mor.get_attribute_type())
AttributeError: 'VIVirtualMachine' object has no attribute 'get_attribute_type'

它的工作方式:

def change_annotation(vm_mor, new_annotation):
    request = VI.ReconfigVM_TaskRequestMsg()
    _this = request.new__this(vm_mor)
    _this.set_attribute_type(vm_mor.get_attribute_type())
    request.set_element__this(_this)

    spec = request.new_spec()
    spec.set_element_annotation(new_annotation)
    request.set_element_spec(spec)
    vc._proxy.ReconfigVM_Task(request)

vc = VIServer()
vc.connect()

properties = ['config.name', 'config.annotation']
vm_mors = []

for vm_mor_sql in cursor:
   vm_mors.append(vm_mor_sql[0])


for vc_vm in vc._retrieve_properties_traversal(property_names=properties, obj_type='VirtualMachine'):
   vm_mor = vc_vm.Obj
   if vm_mor in vm_mors:
      vm = dict()
      print vm_mor,
      try:
         for vm_prop in vc_vm.PropSet:
            vm[vm_prop.Name] = vm_prop.Val
      except AttributeError:
         print 'missing properties'
         continue
      try:
         change_annotation(vm_mor, 'test insert')
      except:
         continue

任何帮助都将不胜感激。

4

0 回答 0