How to unmarshal a Pulumi auto.Result object structure or map

WBOY
Release: 2024-02-10 12:30:17
forward
1214 people have browsed it

如何解组 Pulumi auto.Result 对象结构或映射

php editor Xigua shares how to unmarshal the Pulumi auto.Result object structure or mapping. Pulumi is a cross-cloud infrastructure-as-code tool that allows developers to define and manage cloud infrastructure using programming languages. When developing with Pulumi, you often encounter auto.Result objects, which often contain multiple properties and nested structures. This article explains how to unmarshal a Result object and map it to a more user-friendly data structure for easier processing and manipulation of the data.

Question content

I am using pulumi's automation api in go to deploy the server to hetzner, but don't know how to get the generated connection information from the deployment results.

This is the truncated code:

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)
Copy after login

I am able to retrieve the result from res.outputs but it is a string. I know the server deployment and response with connection details was successful because when I log in to serverconnectinfo it looks like this:

serverconnectinfo map[host:123.456.789.10 port:22 privatekey:-----begin openssh private key-----
b3blbnnza...
-----end openssh private key-----
user:root]
Copy after login

Based on some questionable solutions online, I tried marshalling it like json and then unmarshaling it into a pulumi remote.connectionargs instance. This obviously doesn't work because the structure looks like this:

// From https://pkg.go.dev/github.com/pulumi/pulumi-command/[email protected]/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"`
}
Copy after login

I was thinking of building my own struct and retrying the json unmarshaling and marshaling solution, but it seems like if the connectionargs struct already has the pulumi tag it should be there somewhere Some kind of pulumi.unmarshal method. am I wrong? Anyway, I didn't find it.

I also looked at the documentation but didn't see anything helpful. Maybe I missed a page?

Workaround

As peter pointed out in the comments, res.outputs["server-connect-info"].value is a mapping, and correctly Guess I ran it via fmt.sprintf. How stupid I was.

This works:

serverconnectinfo := res.outputs["server-connect-info"].value.(map[string]interface{})
Copy after login

Also works well with go tests using the built-in test package:

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

The above is the detailed content of How to unmarshal a Pulumi auto.Result object structure or map. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template