概要
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 件のコメント:
コメントを投稿