首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在golang中使用govmomi库的零点指示

是指使用govmomi库来管理和操作VMware vSphere环境中的虚拟机的开机时间。

govmomi是一个用于与VMware vSphere进行交互的Go语言库。它提供了一组功能丰富的API,可以通过编程方式管理和操作vSphere环境中的虚拟机、主机、数据存储和网络等资源。

在使用govmomi库的零点指示中,我们可以通过以下步骤来实现:

  1. 导入govmomi库:在Go代码中,首先需要导入govmomi库,以便可以使用其中的函数和类型。
代码语言:txt
复制
import (
    "github.com/vmware/govmomi"
    "github.com/vmware/govmomi/vim25"
    "github.com/vmware/govmomi/vim25/soap"
)
  1. 创建vSphere客户端:使用govmomi库提供的函数和类型,创建一个与vSphere环境进行交互的客户端。
代码语言:txt
复制
func createClient() (*govmomi.Client, error) {
    url := "https://vcenter.example.com/sdk"
    username := "username"
    password := "password"

    // 创建SOAP客户端
    soapClient := soap.NewClient(url, true)
    // 使用用户名和密码进行身份验证
    err := soapClient.Login(context.Background(), url, username, password)
    if err != nil {
        return nil, err
    }

    // 创建vSphere客户端
    vimClient, err := vim25.NewClient(context.Background(), soapClient)
    if err != nil {
        return nil, err
    }

    // 返回vSphere客户端
    return &govmomi.Client{
        Client:         vimClient,
        RoundTripper:   soapClient,
    }, nil
}
  1. 获取虚拟机对象:使用vSphere客户端,可以获取到vSphere环境中的虚拟机对象,以便后续对其进行操作。
代码语言:txt
复制
func getVirtualMachine(client *govmomi.Client, vmName string) (*object.VirtualMachine, error) {
    // 获取根目录
    rootFolder := client.ServiceContent.RootFolder

    // 创建一个对象导航器
    navigator := client.ServiceContent.SearchIndex

    // 根据虚拟机名称查找虚拟机对象
    vm, err := navigator.FindByInventoryPath(context.Background(), vmName)
    if err != nil {
        return nil, err
    }

    // 返回虚拟机对象
    return vm.(*object.VirtualMachine), nil
}
  1. 设置开机时间:通过虚拟机对象,可以设置虚拟机的开机时间。
代码语言:txt
复制
func setPowerOnTime(vm *object.VirtualMachine, powerOnTime time.Time) error {
    // 创建一个虚拟机配置对象
    configSpec := types.VirtualMachineConfigSpec{
        Tools: &types.ToolsConfigInfo{
            ToolsUpgradePolicy: string(types.ToolsUpgradePolicyUpgradeAtPowerCycle),
        },
        ScheduledHardwareUpgradeInfo: &types.ScheduledHardwareUpgradeInfo{
            UpgradePolicy: string(types.ScheduledHardwareUpgradePolicyUpgradeAtPowerCycle),
            ScheduledHardwareUpgradeStatus: []types.ScheduledHardwareUpgradeStatus{
                {
                    ScheduledHardwareUpgradeStatus: string(types.ScheduledHardwareUpgradeStatusInfoScheduled),
                    ScheduledHardwareUpgradeTime:  powerOnTime,
                },
            },
        },
    }

    // 执行虚拟机配置更改
    task, err := vm.Reconfigure(context.Background(), configSpec)
    if err != nil {
        return err
    }

    // 等待任务完成
    err = task.Wait(context.Background())
    if err != nil {
        return err
    }

    return nil
}
  1. 完整示例代码:以下是一个完整的示例代码,演示了如何使用govmomi库来设置虚拟机的开机时间。
代码语言:txt
复制
package main

import (
    "context"
    "fmt"
    "time"

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

func main() {
    // 创建vSphere客户端
    client, err := createClient()
    if err != nil {
        fmt.Println("Failed to create vSphere client:", err)
        return
    }

    defer client.Logout(context.Background())

    // 获取虚拟机对象
    vm, err := getVirtualMachine(client, "vm-1")
    if err != nil {
        fmt.Println("Failed to get virtual machine:", err)
        return
    }

    // 设置开机时间为当前时间加10分钟
    powerOnTime := time.Now().Add(10 * time.Minute)
    err = setPowerOnTime(vm, powerOnTime)
    if err != nil {
        fmt.Println("Failed to set power on time:", err)
        return
    }

    fmt.Println("Power on time set successfully:", powerOnTime)
}

func createClient() (*govmomi.Client, error) {
    url := "https://vcenter.example.com/sdk"
    username := "username"
    password := "password"

    // 创建SOAP客户端
    soapClient := soap.NewClient(url, true)
    // 使用用户名和密码进行身份验证
    err := soapClient.Login(context.Background(), url, username, password)
    if err != nil {
        return nil, err
    }

    // 创建vSphere客户端
    vimClient, err := vim25.NewClient(context.Background(), soapClient)
    if err != nil {
        return nil, err
    }

    // 返回vSphere客户端
    return &govmomi.Client{
        Client:         vimClient,
        RoundTripper:   soapClient,
    }, nil
}

func getVirtualMachine(client *govmomi.Client, vmName string) (*object.VirtualMachine, error) {
    // 获取根目录
    rootFolder := client.ServiceContent.RootFolder

    // 创建一个对象导航器
    navigator := client.ServiceContent.SearchIndex

    // 根据虚拟机名称查找虚拟机对象
    vm, err := navigator.FindByInventoryPath(context.Background(), vmName)
    if err != nil {
        return nil, err
    }

    // 返回虚拟机对象
    return vm.(*object.VirtualMachine), nil
}

func setPowerOnTime(vm *object.VirtualMachine, powerOnTime time.Time) error {
    // 创建一个虚拟机配置对象
    configSpec := types.VirtualMachineConfigSpec{
        Tools: &types.ToolsConfigInfo{
            ToolsUpgradePolicy: string(types.ToolsUpgradePolicyUpgradeAtPowerCycle),
        },
        ScheduledHardwareUpgradeInfo: &types.ScheduledHardwareUpgradeInfo{
            UpgradePolicy: string(types.ScheduledHardwareUpgradePolicyUpgradeAtPowerCycle),
            ScheduledHardwareUpgradeStatus: []types.ScheduledHardwareUpgradeStatus{
                {
                    ScheduledHardwareUpgradeStatus: string(types.ScheduledHardwareUpgradeStatusInfoScheduled),
                    ScheduledHardwareUpgradeTime:  powerOnTime,
                },
            },
        },
    }

    // 执行虚拟机配置更改
    task, err := vm.Reconfigure(context.Background(), configSpec)
    if err != nil {
        return err
    }

    // 等待任务完成
    err = task.Wait(context.Background())
    if err != nil {
        return err
    }

    return nil
}

以上代码示例了如何使用govmomi库来设置虚拟机的开机时间。在实际应用中,可以根据需要进行适当的修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

知识分享之Golang——Golang管道(channel)使用

知识分享之Golang——Golang管道(channel)使用 背景 知识分享之Golang篇是我日常使用Golang时学习到各种各样知识记录,将其整理出来以文章形式分享给大家,来进行共同学习...开发环境 系统:windows10 语言:Golang golang版本:1.18 内容 本节我们分享Golang管道(channel)使用使用管道时我们需要注意:先进先出原则。...以下是其相关代码和使用说明(代码注释) package main import "fmt" func main() { // 声明一个管道 var ch chan int...{ // c是接受对象,ok是本次读取装填,当管道没有值了或管道关闭了,这时就会返回false c, ok := <-ch if ok {...协程,使用起来我们就可以实现各种各样高并发、队列机制等功能了。

81620

GoLang 日志 zap 使用

根据 zap 自己基准测试结果,它比其它结构化日志(比如我之前使用 logrus )要有更好性能。接下来主要介绍一下 zap 使用方法。..., _ := zap.NewProduction() defer logger.Sync() // 将 buffer 日志写到文件 logger.Info("this is a test log"...默认情况,Linux 写文件都是异步,写内容会先缓存在内存里,合适时间刷(flush)到磁盘。而 Sync 是一个强制将缓存数据立刻刷入磁盘命令。...所以 GoLang 标准 File 就有 Sync 函数来对应这个命令。因此 logger.Sync()做事情就是对所有输出目标文件执行 Sync。...总结一下,使用 zap 不需要我们付出多少额外工作量,却可以得到比较明显性能提升,因此如果你项目需要输出结构化日志到文件,不妨使用 zap。

10.6K11
  • Golang函数使用

    函数 函数调用:函数调用时需要传递函数定义要求参数,并根据需要接收返回值。 匿名函数:匿名函数没有函数名,可以直接定义并调用。常用于函数内部作为闭包使用。...函数变量作用域 函数声明变量作用域是该函数内部,函数外部是不可见。如果函数中使用了全局变量,则在函数可以直接使用。 函数递归调用 函数可以递归调用,递归调用必须有一个终止条件。...defer 语句可以被插入到函数任意位置,并且可以定义多个 defer 语句。函数执行时,每个 defer 语句都会被压入一个栈,等待函数返回时逆序执行。... myFunc 函数,defer 语句被用来调用 timeTrack 函数,并传入当前时间和函数名作为参数。当 myFunc 函数返回时,timeTrack 函数被执行,输出函数执行时间。...函数变量:Go语言中,函数也可以作为变量使用,可以将函数赋值给变量,也可以作为参数传递给其他函数。 defer语句:defer语句用于函数返回前执行一些清理操作,例如关闭文件、释放锁等。

    15830

    GolangModel使用

    导语 我们都知道Golang我们一般都是设置GOPATH目录,这个目录主要存放我们第三方包,这个方式一直不是很方便,今天给大家介绍Go 1.11版本推出GoModul使用方法,学过java同学...使用之前准备 安装Go版本后,这个功能默认是关闭,需要我们手动设置环境变量进行开启,设置方式如下 //go命令行将不会支持module功能 O111MODULE=off //go命令行会使用modules...GO111MODULE=on //自动进行 GO111MODULE=auto 开始使用 为了更加直观看到model使用之后好处,建议GOPATH目录之外进行创建一个目录进行练习,首先我们创建如下目录结构...并且我们目录结构同时又添加了一个文件go.sum如下图所示存放着我们包具体信息 ?...修改版本 在上面的使用我们成功引用了自己代码,但是如果我们仓库代码进行了升级,我们进行了修改之后,又该如何引用最新代码呢 比如修改Add函数 package common import (

    6.2K10

    CSReidNetCore工作场景使用

    ## 关于我 [作者博客|文章首发](http://www.zhouhuibo.club) 过去 .net 最有名望 ServiceStack.Redis 早已沦为商业用途, .NETCore...经过网上一些整理和推荐,发现了一款开源CSReidsCore。...CSRedisCore是国人开源一套Redis操作,现在最新版本已经V3.6.5,经过几个实际公司项目的使用情况来看,还没有出现什么大问题,本文主要介绍一下使用这个过程一些自己想法。...: 将实例后各个RedisDb整合在数组,单例截注入services ``` var connectionString = "127.0.0.1:6379,password=123,poolsize...,可以参照”Redis多个Db使用“标签进行设置** ## 高级用法 CSRedis高级用法可以参考这篇文章 [.NETCore 简单且高级 csredis v3.0.0](https://www.cnblogs.com

    2K40

    golang开发使用

    golang,所有源文件都属于一个包,golang包具有以下特性: 包可以被其他包引用 每个golang程序只有一个main包 包主要用途是提高代码可复用性 本节,我们将介绍包相关概念以及使用方法...使用GOPATH时,golang会在以下目录搜索包: GOROOT/src:该目录保存了Go标准库里代码。 GOPATH/src:该目录保存了应用自身代码和第三方依赖代码。 2....,GO111MODULE环境变量我们文章后面部分说明 export GOPATH=/Users/pan/go # 把自己golang项目目录作为GOPATH变量 export GO111MODULE...编译 golanggo build 命令主要用于编译代码。编译过程,若有必要,会同时编译与之相关联包。...命令,go install用来生成和工具并存放于GOPATH

    75820

    【云+社区年度征文】Golang如何正确地使用databasesql包访问数据

    本文记录了我实际工作关于数据操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上东西,所以希望能抛砖引玉,也算是对这个问题一次总结。...慢慢我就发现,连续多次操作数据后就偶尔发生程序卡死情况,请求一直是pending状态,只能杀死进程重启才可以。...核心意思就是sql.DB是一个长生命周期对象,你不要随便打开和关闭,并且建议你程序为每一个数据创建唯一sql.DB。 那么现在问题就是如何保证程序只有一个连接池呢?...很简单,使用一个全局变量即可,有点类似C#和javastatic味道,Golang可以使用如下方法声明一个全局对象: package demo import ( "database/sql"...以上就是工作中使用golang访问数据踩坑历程,希望能帮到新接触golang朋友,如有错误地方欢迎指出,以免误导他人。

    1.8K91

    Golanglog日志包使用

    Golanglog日志包使用 强烈推介IDEA2020.2破解激活,IntelliJ...2.log包介绍 Golang记录日志非常方便,Golang提供了一个简单日志记录包log,包定义了一个结构体类型 Logger,是整个包基础部分,包其他方法都是围绕这整个结构体创建。...日志输出目标,需要是一个实现了 io.Writer接口对象,如: os.Stdout, os.Stderr, os.File等等 buf :用于缓存数据 flag可选值 其中flaglog包定义了一些常量...3.log包使用 3.1 日志输出方法 log包定义了如下一套日志信息输出方法: func (l *Logger) Print(v ...interface{ }) //直接打印输出 func...方法实现 Output 方法,做了如下这些事情: 获取当前事件 对 Logger实例进行加锁操作 判断Logger标志位是否包含 Lshortfile 或 Llongfile, 如果包含进入步骤

    82010

    Swift图表中使用Foundation测量类型

    Swift 图表中使用Foundation 测量类型 在这篇文章,我们将建立一个条形图,比较基督城地区自然散步持续时间。...我们使用 Foundation 框架测量类型Measurement和单位类型UnitDuration来表示每次步行时间。...这意味着,我们将无法正确格式化图表标签来向用户表示单位。虽然我们可以记住我们创建测量时使用了小时hours,但这并不理想。...我决定将测量值转换为分钟,但你可以选择适合你需要任何其他单位。只是与原始值转换时要使用相同单位,这一点很重要。 我们现在可以更新我们图表,以使用我们自定义Plottable类型。...我们收到值是使用我们Plottable一致性定义初始化器创建,所以我们案例,测量值是以分钟为单位提供。但我相信对于这个特定图表,使用小时会更好。

    2.7K20

    Json序列化golang应用

    关于我 作者博客|文章首发 golang对json序列化和反序列化操作实在是难受,所以说用习惯了高级语言特性,再转到这些偏原生写法上就会很难受。 不多BB,开始记录。...序列化选择 当写个小demo或者做个小工具,没有大规模使用场景,那使用哪个都是一样,因为性能体现并不会很明显。...但是如果是实际项目中使用,且伴随着高并发,大容量等场景,我还是推荐使用json-iterator。...go自带json "encoding/json" 官当自带 json-iterator 号称最快go json解析器。跟官方写法兼容,我目前基本都使用这个。...GitHub上Star最高工程师技能图谱 中国程序员最容易发错单词 END 欢迎关注公众号 程序员工具集 致力于分享优秀开源项目、学习资源 、常用工具 回复关键词“关注礼包”,送你一份最全程序员技能图谱

    2.1K30

    WindowsXamlHost: WPF 中使用 UWP 控件控件

    WindowsXamlHost: WPF 中使用 UWP 控件(Windows Community Toolkit) 一文,我们说到了 WPF 引入简单 UWP 控件以及相关注意事项...创建一个 UWP 控件 建议专门为你复杂 UWP 控件创建一个 UWP 控件。在这个控件开发就像普通 UWP 应用一样。...image.png ▲ 创建一个 UWP 控件 image.png ▲ 选择 SDK 版本 对 WPF 项目的准备工作 你依然需要阅读 WindowsXamlHost: WPF 中使用...image.png ▲ 生成文件已复制到 WPF 目录下 WPF 项目中间接引用 UWP 控件 现在, WPF 项目中开启所有文件夹显示,然后将 UWP 项目中生成文件添加到 WPF... WPF 项目中使用 UWP 控件控件 这时, WindowsXamlHost 中就可以添加 UWP 控件 MainPage 了。

    5.8K20

    Swift 图表中使用 Foudation 测量类型

    我们使用 Foundation 框架测量类型Measurement[1]和单位类型UnitDuration[2]来表示每次步行时间。...这意味着,我们将无法正确格式化图表标签来向用户表示单位。虽然我们可以记住我们创建测量时使用了小时 hours,但这并不理想。...我决定将测量值转换为分钟,但你可以选择适合你需要任何其他单位。只是与原始值转换时要使用相同单位,这一点很重要。 我们现在可以更新我们图表,以使用我们自定义 Plottable 类型。...我们收到值是使用我们 Plottable 一致性定义初始化器创建,所以我们案例,测量值是以分钟为单位提供。但我相信对于这个特定图表,使用小时会更好。...你可以从我们 GitHub repo 获得这篇文章中使用项目的完整 示例代码[4]。

    2.4K30

    简单方便Golang使用Redis【Golang 入门系列】七

    想了解可以看之前文章:https://www.cnblogs.com/zhangweizhong/category/771056.html 2. golang 客户端,用是 go-redis,   ...客户端, 这个方法接收一个 redis.Options 对象参数, 通过这个参数, 我们可以配置 redis 相关属性, 例如 redis 服务器地址, 数据名, 数据密码等。...keystring赋予值valueget(key):返回数据名称为keystringvalue   GetSet(key, value):给名称为keystring赋予上一次value   ...MGet(key1, key2,…, key N):返回多个stringvalue   SetNX(key, value):添加string,名称为key,值为value   SetXX(key,...time, value):向添加string,设定过期时间time   MSet(key N, value N):批量设置多个string值   MSetNX(key N, value N):如果所有名称为

    2.8K10

    Visual Sutdio 2017使用boost

    对C++有一定了解同学一定听说过boost,这是C++一个著名类C++地位感觉可以和SpringJava相比。...VS设置 VS中新建一个C++项目,然后打开项目属性页,然后切换到VC++目录,包含目录和目录中分别添加BOOST_ROOT和BOOST_ROOT\libs两个文件夹。 ? ? ?...配置完成后,就可以项目中使用boost了。当然对于Visual Studio来说,还有更简单办法,那就是使用NuGet。...由于boost是一个比较大,所以这个安装过程可能需要多花费几分钟。安装完成后boost类会放到项目文件夹package文件夹。NuGet会自动帮我们配置好包含路径等设置。...例如这里我准备使用boost一些高精度(最大可达100位)数学常量(值得吐槽是C++标准居然没有像样数学,能用只有,而且甚至连PI常量都没有)。

    3.4K100

    python配置opencv使用pycharm环境

    最好安装opencv 2.几版本(如2.4.13)安装opencv3 老是出现no modules错误,换成2.几就好了 第一步:安装openCV 1.官网下载:点击打开链接,官网上有所有的...注明:这里"X64"表示我电脑是64位系统,如果你电脑是32位,你应该在"x86"下面找,"VC11"表示我电脑安装是vs2012,如果你电脑上安装是VS2010你应该在"vc10"文件夹下...弹出窗口中,“变量值”后面添加“;”和刚才目录,也就是添加这个字符串";F:\chengxin\openCV2.4.9\opencv\build\x64\vc11\bin"。如图示: ?...如果你是32位系统,那么你应该是“x86”下面。如图示: ?...通过cmd控制台,我们可以尝试一下运行openCV自带一些python写example。这些example“opencv\sources\samples\python”下面可以看到。

    6K20
    领券