본문 바로가기
VMware

Vmware / python sdk / pyvmomi pyVmomi.vmodl.query.PropertyCollector traversalspec object searching 오브젝트 서칭

by ahsung 2022. 3. 14.

pyvmomi는 VCSA 혹은 ESXI의 SOAP API를 호출하는 SDK이며, vmware의 유료 라이센스를 구입하고 키를 입력해야 모든 SDK의 기능을 사용 가능합니다.

무료버전으로만 사용시 기능이 제한됩니다.


 

 

Vmware를 사용과 운영하다보면 VM, Host등의 Managed Object들에 대해서 커스텀한 조회가 필요한 경우가 존재합니다.

 

pyvmomi의 object property를 얻기 위한 공식 샘플 코드

 

GitHub - vmware/pyvmomi-community-samples: A place for community contributed samples for the pyVmomi library.

A place for community contributed samples for the pyVmomi library. - GitHub - vmware/pyvmomi-community-samples: A place for community contributed samples for the pyVmomi library.

github.com

 

공식 github 커뮤니티에서 보듯이 pyVmomi.vmodl.query.PropertyCollector  모듈을 사용하면 효과적으로 VCSA 혹은 ESXI에서 Object의 property를 얻을 수 있습니다.

해당 모듈을 사용하지 않고 기본적인 Managed Object 객체(pyVmomi.vim.VirtualMachine 등등)를 사용하면 객체의 property에 접근할 때마다 VCSA와 ESXI에 네트워크를 통한 호출이 발생됩니다.

하지만 PropertyCollector 모듈을 사용할 경우, 내가 원하는 오브젝트들의 property를 미리 명시하여 한번의 요청으로 빠르게 정보를 취합할 수 있습니다.

 

 

pyVmomi.vmodl.query.PropertyCollector 모듈에는 Object search를 위한 4가지 클래스가 있습니다.

Object와 TraversalSpec은 그래프처럼 관련있는 Object를 서로 연결하여 스펙을 명세합니다.

1. TraversalSpec

    Object와의 연결된 또다른 Object와의 연결고리를 명세합니다.

    (가장 활용이 난해합니다..)

2. ObjectSpec

    검색할 Object를 명세합니다.

3. PropertySpec

    검색할 Property를 명세합니다. Property는  Managed Object 객체(pyVmomi.vim.~~)의 멤버 변수(Property)입니다.

4. FilterSpec

    최종적으로 VCSA or ESXI에 정보를 요구할 명세(스펙) 사항입니다.

 

공식 문서의 샘플 코드를 보면 모든 오브젝트를 대상으로 PropertyCollector를 활용한 서칭 방법은 아주 잘 나와있습니다만,

단일 Object혹은 지정된 여러개의 Object 건에 대한 서칭은 나와있지 않습니다. 

 

단일, 여러개의 지정된 Object를 조회하기 위해서는 ObjectSpec을 공식문서처럼 container view로 만드는 것이 아닌

내가 조회하고 싶은 Managed Object를 직접 넣어서 생성하면 됩니다.

 

다만 큰 문제점이라면,

PropertyCollector 모듈은 설계부터가 PropertySpec에서 자신과는 다른 Object의 Property를 바로 접근할 수 없도록 되어 있습니다.

예시로 VM의 메모리와 호스트의 이름을 얻어오고 싶다면, PropertySpec에 ( "config.memorySizeMB" , "runtime.host.name" ) 이런 내용을 전달할 수 없습니다.

 

VM의 Managed Object 객체가 가지고 있는 property는 runtime.host 까지이며, host는 또다른 Managed Object이므로 host를 통해서 다시 ".name"을 검색해야합니다.

 

이러듯 VM과 관련된 Object의 Property를 알기위한 재검색은 Network I/O를 추가적으로 발생시키고, 이를 개선하고자 지원하는 것이

TraversalSpec 입니다.

(대체 왜 이렇게 설계했는지는 ;;ㅠㅠ 오래전에 만들어진 SOAP API 스펙과 호환하려다보니 그런듯합니다)

TraversalSpec(

name="string", 					# 중복시 에러이므로 그냥 적지 마세요
path="string"					# Managed Object의 property이자 반드시 해당 propery는 Managed Object를 의미해야한다.
type=Managed_Objet_Type,			# ex) pyVmomi.vim.VirtualMachine
skip=bool,					# 현재 Traversal 명세의 오브젝트를 검색할지 안할지
selectSet=[TraversalSpec,...]			# 그래프처럼 계속 연관 스펙들을 연결함
)

 

코딩을 통해서 명세하는 flow

TraversalSpec ──> ObjectSpec 
                       │
                       ├────>  FilterSpec ──> VCSA or ESXI
                       │
                   PropertySpec

VCSA(or ESXI)에서 명세를 풀어서 해석하고 서칭하는 과정은 역방향과 같습니다.

ObjectSpec은 어떤 오브젝트를 서칭할 것인지이고, PropertySpec은 특정 타입의 오브젝트들에서 수집할 Property입니다.

둘은 서로 독립적으로 FilterSpec에 들어가므로, Object마다 수집할 Property를 따로 지정할 순 없습니다.

(같은 타입의 Object들은 모두 같은 Property 정보만 수집 가능)

 

VM과 VM이 실행중인 Host를 포함하여 명세한 ObjectSpec을 만들고 싶다면 아래처럼 연결할 수 있습니다.

traversal_spec = TraversalSpec(type=VirtualMachine , path="runtime.host", skip=False)
object_spec = ObjectSpec(obj=pyVmomi.vim.VirtualMachine("moId"), selectSet=[traversal_spec])

 

Host용 PropertySpec과 VM용 PropertySpec를 각각 생성하여  VM과 관련된 Host 둘다 한번에 property를 얻을 수 있습니다.

 

VM과 연관된 Cluster, datacenter, resource pool이 궁금하다면 traversal_spec의 selectSet을 통해서 그래프처럼 depth를 늘려서 최종 ObjectSpec을 생성하면 됩니다.

 

 

 

 

 

댓글