首页
学习
活动
专区
工具
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 {...协程,使用起来我们就可以实现各种各样高并发、队列机制等功能了。

82420

go介绍:GolangViper

GolangViper:强大配置管理解决方案Golang(Go)开发,配置管理是一个不可或缺部分。...一个优雅配置管理方案不仅能够简化应用程序配置处理流程,还能提高应用程序灵活性和可维护性。在这方面,Viper无疑是Go生态系统一颗璀璨明珠。...本文将详细介绍Viper及其使用场景,并通过具体示例展示其强大功能。...代码,需要初始化Viper实例。...同时,它还会开启一个协程来监听配置文件变化,一旦配置文件被修改,就会触发回调函数并打印出提示信息。四、总结Viper以其强大功能和灵活配置管理方式,Go生态系统得到了广泛应用。

10310
  • Golang函数使用

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

    16630

    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

    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

    76520

    【云+社区年度征文】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, 如果包含进入步骤

    82610

    Json序列化golang应用

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

    2.2K30

    Swift图表中使用Foundation测量类型

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

    2.7K20

    简单方便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

    Swift 图表中使用 Foudation 测量类型

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

    2.4K30

    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.9K20

    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
    领券