2017年6月9日金曜日

govmomi で指定の VApp をフォルダ配下に移動させる

概要

VApp をフォルダ配下に移動する方法を紹介します
1 つの VApp をあるフォルダに移動します

環境

  • 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)

        // フォルダの取得
        folder, err := f.Folder(ctx, "/dc/vm/folder/")
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Println(folder.Common.InventoryPath)
        // VirtualApp の取得
        varefs := []types.ManagedObjectReference{}
        va, err := f.VirtualApp(ctx, "/dc/vm/vapp")
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Println(va.Common.InventoryPath)
        varefs = append(varefs, va.Reference())
        // フォルダへ移動
        t, err := folder.MoveInto(ctx, varefs)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        info, err := t.WaitForResult(context.Background(), nil)
        if err != nil {
                fmt.Println(err)
                os.Exit(1)
        }
        fmt.Println(info.State)
}

ポイントはフォルダのオブジェクトに対して実行している MoveInto メソッドになります
この引数に moref を指定することで指定した moref をフォルダに移動するという処理を行っています
対象の VApp に対して移動せよという命令をするわけではなく、フォルダに対してこのフォルダに入れるという処理をしているのがポイントです

実行後に WaitForResult を使って処理が完了するのを待っています
完了後 info.State で結果を表示して終了です

今回のコードの場合、指定するフォルダと VApp のパスが存在しない場合はエラーになります
なので、一度実行したあと再度実行したい場合は対象の VApp を元のパスに戻す必要があります

最後に

govmomi を使って VApp を特定のフォルダに移動してみました
参照系よりか簡潔に書くことができました

参考サイト

0 件のコメント:

コメントを投稿