2017年6月7日水曜日

govmomi でフォルダの情報を取得する方法

概要

vCenter 配下で管理されているフォルダ情報を govmomi を使って取得してみます
すべてのフォルダを取得する方法と単体で取得する方法を紹介します

環境

  • Ubuntu 16.04
  • golang 1.8
  • govmomi 0.14.0

ソースコード

  • vim main.go
package main

import (
        "context"
        "flag"
        "fmt"
        "net/url"
        "os"

        "github.com/vmware/govmomi"
        "github.com/vmware/govmomi/find"
        "github.com/vmware/govmomi/property"
        "github.com/vmware/govmomi/vim25/mo"
        "github.com/vmware/govmomi/vim25/types"
)

var envURL = "https://192.168.100.101/sdk"
var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL)
var urlFlag = flag.String("url", envURL, urlDescription)

var envInsecure = true
var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure)
var insecureFlag = flag.Bool("insecure", envInsecure, insecureDescription)

func main() {
        // vCenter への接続
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
        flag.Parse()
        u, err := url.Parse(*urlFlag)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        u.User = url.UserPassword("vcenter_user", "vcenter_pass")
        c, err := govmomi.NewClient(ctx, u, *insecureFlag)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Println(c.Client.Client.Version)

        // データセンターの取得
        f := find.NewFinder(c.Client, true)
        dc, err := f.DefaultDatacenter(ctx)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        f.SetDatacenter(dc)
        fmt.Println(dc)

        // フォルダの取得
        pc := property.DefaultCollector(c.Client)
        frefs := []types.ManagedObjectReference{}
        folder, err := f.Folder(ctx, "/dc/vm/folder_name/")
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Println(folder.Common.InventoryPath)
        frefs = append(frefs, folder.Reference())
        var fdst []mo.Folder
        err = pc.Retrieve(ctx, frefs, nil, &fdst)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        for _, f := range fdst {
                fmt.Println(f.Name)
                fmt.Println(f.Tag)
        }
        // 全フォルダの取得
        fsrefs := []types.ManagedObjectReference{}
        folders, err := f.FolderList(ctx, "*")
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        for _, folder := range folders {
                fmt.Println(folder.Common.InventoryPath)
                fsrefs = append(fsrefs, folder.Reference())
        }
        var fsdst []mo.Folder
        err = pc.Retrieve(ctx, fsrefs, nil, &fsdst)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        for _, f := range fsdst {
                fmt.Println(f.Name)
                fmt.Println(f.Tag)
        }
}

まず vCenter に接続しデータセンターの情報を取得します
その後 f.Folder にフォルダのパスを指定することでフォルダ単体を取得しています
取得後は types.ManagedObjectReference に突っ込んで pc.Retrieve することでフォルダの情報を取得しています
あとは types.ManagedObjectReference に設定された値をループで回して参照しているだけです

全件取得の場合には f.FolderList(ctx, "*") とパスの部分をアスタリスクにすることで実現できます
あとは同じ流れで moref に突っ込んで pc.Retrieve で設定し、moref をループで回して参照するだけです

今回は Name と Tag を参照していますが、フォルダの他の情報を参照したい場合は godoc を見てください
https://godoc.org/github.com/vmware/govmomi/vim25/mo#Folder

最後に

govmomi を使ってフォルダを参照する方法を紹介しました
フォルダのオブジェクトが取得できるようになればフォルダに対する操作もできるようになります
例えば削除や名前の変更 VM をフォルダに移動することなどができるようになります

その辺の操作周りに関しても別記事で紹介できればなと思います

参考サイト

0 件のコメント:

コメントを投稿