Go语言 如何反封送PulumiAuto.Result对象结构或Map

yc0p9oo0  于 2023-05-04  发布在  Go
关注(0)|答案(1)|浏览(87)

我正在使用Go语言中的Pulumi的自动化API将服务器部署到Hetzner,但是我不知道如何从部署结果中获取最终的连接信息。
下面是截断的代码:

import (
    ...

    "github.com/pulumi/pulumi-command/sdk/go/command/remote"
    "github.com/pulumi/pulumi/sdk/v3/go/auto"
    "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

...

deployFunc := func(ctx *pulumi.Context) error {
        // Create SSH key pair, upload them to Hetzner, get back a `*hcloud.SshKey`
        ...
        
        // `server` is a *hcloud.Server object
        server, _ := DeployServerToHetzner(ctx, sshKey)

        // This is the info I want to retrieve from the result
        connectInfo := remote.ConnectionArgs{
            Host:       server.Ipv4Address,
            Port:       pulumi.Float64(22),
            User:       pulumi.String("root"),
            PrivateKey: sshKeyPair.Private,
        }

        ctx.Export("server-connect-info", connectInfo)

        return nil
    }

stack, _ := auto.UpsertStackInlineSource(ctx, stackName, projectName, deployFunc, opts...)

res, _ := stack.Up(ctx)

// This is a string but I need it as either map or struct
serverConnectInfo := fmt.Sprintf("%v", res.Outputs["server-connect-info"].Value)

我可以从res.Outputs中检索结果,但它是一个字符串。我知道服务器部署和连接详细信息的响应是成功的,因为当我记录serverConnectInfo时,它看起来像这样:

serverConnectInfo map[host:123.456.789.10 port:22 privateKey:-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNza...
-----END OPENSSH PRIVATE KEY-----
user:root]

基于网上一些可疑的解决方案,我尝试将其编组为JSON,然后将其解编组为Pulumi remote.ConnectionArgs示例。这显然不起作用,因为结构体看起来像这样:

// From https://pkg.go.dev/github.com/pulumi/pulumi-command/sdk@v0.7.2/go/command/remote#ConnectionArgs

type ConnectionArgs struct {
    ...
    Host pulumi.StringInput `pulumi:"host"`
    Port pulumi.Float64PtrInput `pulumi:"port"`
    PrivateKey pulumi.StringPtrInput `pulumi:"privateKey"`
    User pulumi.StringPtrInput `pulumi:"user"`
}

我正在考虑构造自己的结构体,然后重试JSON解组和编组解决方案,但似乎如果ConnectionArgs结构体已经有pulumi标记,那么应该在某处有某种pulumi.Unmarshal方法。我说错了吗?反正我也找不到。
我也看过文档,但没有看到任何有用的东西。也许我错过了一页。

pxiryf3j

pxiryf3j1#

正如Peter在评论中指出的那样,res.Outputs["server-connect-info"].Value是一个Map,并且正确地猜到我通过fmt.Sprintf运行了它。我真是太傻了
这是可行的:

serverConnectInfo := res.Outputs["server-connect-info"].Value.(map[string]interface{})

在使用内置测试包的Go测试中也能很好地工作:

assert.NotEmpty(t, serverConnectInfo["host"])
assert.Equal(t, serverConnectInfo["user"], "root")

相关问题