2017年4月26日水曜日

vic-machine delete コマンドをコードからライブラリとして使う方法

概要

前回 vic-machine ls コマンドをコードから実行してみました
今回は vic-machine delete コマンドをコードから実行してみました

環境

  • Ubuntu 16.04
  • golang 1.8.1
  • vic 0.9.0

delete を実行するコードの作成

  • mkdir /path/to/work
  • cd /path/to/work
  • vim my_vic_delete.go
package main

import (
        "context"
        "fmt"
        "github.com/vmware/vic/lib/install/data"
        "github.com/vmware/vic/lib/install/management"
        "github.com/vmware/vic/lib/install/validate"
        "github.com/vmware/vic/pkg/vsphere/vm"
        "net/url"
)

type Delete struct {
        Data     *data.Data
        executor *management.Dispatcher
}

func NewDelete() (d *Delete, err error) {
        d = new(Delete)
        d.Data = data.NewData()
        u, err := url.Parse("https://192.168.100.101/dc")
        if err != nil {
                return d, err
        }
        d.Data.Target.URL = u
        l.Data.Target.User = "vcenter_username"
        p := "vcenter_password"
        d.Data.Target.Password = &p
        l.Data.Target.Thumbprint = "F9:xx:xx:..."
        d.Data.Force = true
        err = d.Data.Target.HasCredentials()
        if err != nil {
                return d, err
        }
        //d.Data.ID = "vm-100"
        d.Data.DisplayName = "vch001"
        d.Data.ComputeResourcePath = "rp-1"
        //d.Data.Force = true
        return d, nil
}

func (d *Delete) Run() (err error) {
        ctx, cancel := context.WithTimeout(context.Background(), d.Data.Timeout)
        defer cancel()
        validator, err := validate.NewValidator(ctx, d.Data)
        if err != nil {
                return err
        }
        validator.AllowEmptyDC()
        executor := management.NewDispatcher(validator.Context, validator.Session, nil, false)
        var vch *vm.VirtualMachine
        if d.Data.ID != "" {
                vch, err = executor.NewVCHFromID(d.Data.ID)
        } else {
                vch, err = executor.NewVCHFromComputePath(d.Data.ComputeResourcePath, d.Data.DisplayName, validator)
        }
        fmt.Println(vch)
        vchConfig, err := executor.GetVCHConfig(vch)
        if err != nil {
                return err
        }
        err = executor.DeleteVCH(vchConfig)
        if err != nil {
                executor.CollectDiagnosticLogs()
                return err
        }
        return nil
}

func main() {
        d, err := NewDelete()
        if err != nil {
                fmt.Println(err)
        }
        err = d.Run()
        if err != nil {
                fmt.Println(err)
        }
}
  • go fmt my_vic_delete.go
  • go run my_vic_delete.go

d.Data.ID で ID を指定するか d.Data.DisplayNamed.Data.ComputeResourcePath を vch までの名前とパスを使って指定します
どちらでも OK ですが個人的にはパスで指定する方法をオススメします
パスがわかっていれば govmomi を使って直接 VM に対しても操作できるからです

Force が true になっている場合は vch 上のコンテナが起動中でも強制的に削除してくれます

解説

config して実行の流れは前回と同じです
delete のときのほうが指定するパラメータが増えているので注意してください
ID や DisplayName は ls を実行したときに取得できます

まず executor.NewVCHFromID で vch の情報を取得します
そして、それを元に executor.DeleteVCH をコールすることで vch を削除してくれる他、付属のネットワークとストレージも削除してくれます

executor.CollectDiagnosticLogs で CLI 用のデバッグログを出力してくれます

最後に

vic-machine delete コマンドをコードから実行してみました
delete も結構簡単にできました
あとは inspect あたりができるなるといいかなという感じです

参考サイト

0 件のコメント:

コメントを投稿