Home  >  Article  >  Backend Development  >  How to unmarshal a Pulumi auto.Result object structure or map

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

WBOY
WBOYforward
2024-02-10 12:30:171188browse

如何解组 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)

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]

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"`
}

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{})

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

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

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete